我有一个类属性,通过它可以访问内部的 IList<>
System.Collections.ObjectModel.ReadOnlyCollection<>
我如何传递 ReadOnlyCollection<>
的一部分,而不需要将元素复制到新数组中(我需要实时视图,并且目标设备内存有限)?我目标为Compact Framework 2.0。
我有一个类属性,通过它可以访问内部的 IList<>
System.Collections.ObjectModel.ReadOnlyCollection<>
我如何传递 ReadOnlyCollection<>
的一部分,而不需要将元素复制到新数组中(我需要实时视图,并且目标设备内存有限)?我目标为Compact Framework 2.0。
IEnumerable<T> FilterCollection<T>( ReadOnlyCollection<T> 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();
IEnumerable<object> 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
}
您可以编写一个实现IList接口的类,并将所有调用转发到原始列表(因此它不具有自己的数据副本),在翻译索引后进行。
如何访问筛选后的元素?如果是通过迭代器访问,那么您可以编写一个自定义迭代器来跳过您不想公开显示的元素。
如果您需要提供一个集合,则可能需要编写自己的集合类,它只是代理到底层集合,但防止访问您不想公开显示的元素。
(免责声明:我对C#不是很熟悉,所以这些是一般性的答案。可能有更具体的适用于C#的答案)