我有一个暴露内部IList<>的类属性通过
System.Collections.ObjectModel.ReadOnlyCollection<>
如何在不将元素复制到新数组的情况下传递此ReadOnlyCollection<>
的一部分(我需要实时视图,目标设备内存不足)?我的目标是Compact Framework 2.0。
答案 0 :(得分:15)
尝试使用yield:
返回枚举的方法IEnumerable<T> FilterCollection<T>( ReadOnlyCollection<T> input ) {
foreach ( T item in input )
if ( /* criterion is met */ )
yield return item;
}
答案 1 :(得分:8)
这些foreach样本很好,但是如果你使用.NET 3.5和LINQ,你可以使它们更简洁:
return FullList.Where(i => IsItemInPartialList(i)).ToList();
答案 2 :(得分:1)
您可以随时编写一个实现IList的类,并在翻译索引后将所有调用转发到原始列表(因此它没有自己的数据副本)。
答案 3 :(得分:1)
您可以使用yield return来创建过滤列表
IEnumerable<object> FilteredList()
{
foreach( object item in FullList )
{
if( IsItemInPartialList( item )
yield return item;
}
}
答案 4 :(得分: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
}
答案 5 :(得分:0)
如何访问过滤后的元素?如果是通过Iterator那么也许你可以编写一个自定义迭代器来跳过你不想公开显示的元素?
如果您需要提供Collection,那么您可能需要编写自己的Collection类,它只代理底层Collection,但是阻止访问您不希望公开显示的元素。
(免责声明:我对C#不是很熟悉,所以这些都是一般性答案。可能会有更具体的C#答案更好用)