C# 我怎样才能只暴露IList的一部分<>;?

C# 我怎样才能只暴露IList的一部分<>;?,c#,windows-mobile,compact-framework,.net-2.0,C#,Windows Mobile,Compact Framework,.net 2.0,我有一个类属性,通过 System.Collections.ObjectModel.ReadOnlyCollection 如何传递此ReadOnlyCollection的一部分而不将元素复制到新数组中(我需要实时视图,目标设备内存不足)?我的目标是Compact Framework 2.0。在转换索引后,您可以编写一个实现IList的类,并将所有调用转发到原始列表(因此它没有自己的数据副本)。您可以使用yield return创建过滤列表 IEnumerable<object> F

我有一个类属性,通过

System.Collections.ObjectModel.ReadOnlyCollection

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

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

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

IEnumerable<object> FilteredList()
{
    foreach( object item in FullList )
    {
        if( IsItemInPartialList( item )
            yield return item;
    }
}
IEnumerable FilteredList()
{
foreach(完整列表中的对象项)
{
if(IsItemInPartialList(项目)
收益回报项目;
}
}

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

如果需要提供集合,则可能需要编写自己的集合类,该类仅代理基础集合,但阻止访问不希望公开可见的元素


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

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

IEnumerable<T> FilterCollection<T>( ReadOnlyCollection<T> input ) {
    foreach ( T item in input )
        if (  /* criterion is met */ )
            yield return item;
}
IEnumerable FilterCollection(只读集合输入){
foreach(输入中的T项)
如果符合(/*标准*/)
收益回报项目;
}

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

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

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