如何只暴露 IList<> 的一部分?

12

我有一个类属性,通过它可以访问内部的 IList<>

System.Collections.ObjectModel.ReadOnlyCollection<>

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

6个回答

15
尝试使用yield返回枚举的方法:
IEnumerable<T> FilterCollection<T>( ReadOnlyCollection<T> input ) {
    foreach ( T item in input )
        if (  /* criterion is met */ )
            yield return item;
}

8

这些foreach示例已经很好了,但是如果您使用的是.NET 3.5和LINQ,您可以使它们更加简洁:

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

1
你可以使用yield return来创建一个过滤列表。
IEnumerable<object> FilteredList()
{
    foreach( object item in FullList )
    {
        if( IsItemInPartialList( item )
            yield return item;
    }
}

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
}

1

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


0

如何访问筛选后的元素?如果是通过迭代器访问,那么您可以编写一个自定义迭代器来跳过您不想公开显示的元素。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接