我怎样才能只暴露一个IList 的片段?

我有一个暴露内部IList 的类属性

System.Collections.ObjectModel.ReadOnlyCollection 

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

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

 IEnumerable FilterCollection( ReadOnlyCollection input ) { foreach ( T item in input ) if ( /* criterion is met */ ) yield return item; } 

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

 return FullList.Where(i => IsItemInPartialList(i)).ToList(); 

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

您可以使用yield return来创建筛选列表

 IEnumerable FilteredList() { foreach( object item in FullList ) { if( IsItemInPartialList( item ) yield return item; } } 

根据您需要过滤集合的方式,您可能希望创建一个实现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 } 

如何访问过滤后的元素? 如果是通过Iterator那么也许你可以编写一个自定义迭代器来跳过你不想公开显示的元素?

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

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