2008-09-02 52 views
10

我有一个类属性暴露内部的IList <>通过我如何只公开IList <>的片段?

System.Collections.ObjectModel.ReadOnlyCollection<> 

如何传递的此ReadOnlyCollection<>一部分而不复制元件到一个新的数组(我需要实时取景,和目标设备是短在记忆中)?我的目标是Compact Framework 2.0。

回答

14

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

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

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

1

你可以使用的yield return创建一个过滤列表

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

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

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

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

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 
} 
8

这些样品的foreach都很好,但你可以让他们更加简洁,如果你正在使用.NET 3.5和LINQ:

return FullList.Where(i => IsItemInPartialList(i)).ToList(); 
相关问题