10

我有一个类属性通过

System.Collections.ObjectModel.ReadOnlyCollection<>

如何在ReadOnlyCollection<>不将元素复制到新数组的情况下传递其中的一部分(我需要实时视图,并且目标设备内存不足)?我的目标是 Compact Framework 2.0。

4

6 回答 6

15

尝试使用yield返回枚举的方法:

IEnumerable<T> FilterCollection<T>( ReadOnlyCollection<T> input ) {
    foreach ( T item in input )
        if (  /* criterion is met */ )
            yield return item;
}
于 2008-09-02T13:11:08.867 回答
8

这些 foreach 示例很好,但如果您使用 .NET 3.5 和 LINQ,您可以使它们更简洁:

return FullList.Where(i => IsItemInPartialList(i)).ToList();
于 2008-09-02T13:17:10.303 回答
1

在翻译索引后,您始终可以编写一个实现 IList 的类并将所有调用转发到原始列表(因此它没有自己的数据副本)。

于 2008-09-02T13:09:28.993 回答
1

您可以使用 yield return 创建过滤列表

IEnumerable<object> FilteredList()
{
    foreach( object item in FullList )
    {
        if( IsItemInPartialList( item )
            yield return item;
    }
}
于 2008-09-02T13:10:00.100 回答
1

根据您需要如何过滤集合,您可能希望创建一个实现 IList(或 IEnumerable,如果适合您的话)的类,但这与索引和访问有关,只能返回您想要的值。例如

class EvenList: IList
{
    private IList innerList;
    public EvenList(IList innerList)
    {
         this.innerList = innerList;
    }

    public object this[int index]
    {
        get { return innerList[2*i]; }
        set { innerList[2*i] = value; }
    }
    // and similarly for the other IList methods
}
于 2008-09-02T13:11:46.320 回答
0

过滤后的元素需要如何访问?如果它是通过一个迭代器,那么也许你可以编写一个自定义迭代器来跳过你不希望公开可见的元素?

如果您需要提供 Collection,那么您可能需要编写自己的 Collection 类,该类仅代理底层 Collection,但会阻止访问您不希望公开可见的元素。

(免责声明:我对 C# 不是很熟悉,所以这些是一般性答案。C# 可能有更具体的答案,效果更好)

于 2008-09-02T13:10:27.510 回答