代码之家  ›  专栏  ›  技术社区  ›  skolima

如何仅公开IList的一部分?

  •  10
  • skolima  · 技术社区  · 16 年前

    我有一个暴露内部IList的类属性<&燃气轮机;通过

    System.Collections.ObjectModel.ReadOnlyCollection<>
    

    我怎样才能通过这一部分 ReadOnlyCollection<> 不将元素复制到新阵列中(我需要实时视图,而目标设备内存不足)?我的目标是Compact Framework 2.0。

    6 回复  |  直到 16 年前
        1
  •  15
  •   Timwi    14 年前

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

    IEnumerable<T> FilterCollection<T>( ReadOnlyCollection<T> input ) {
        foreach ( T item in input )
            if (  /* criterion is met */ )
                yield return item;
    }
    
        2
  •  8
  •   Brad Wilson    16 年前

    return FullList.Where(i => IsItemInPartialList(i)).ToList();
    
        3
  •  1
  •   Nir    16 年前

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

        4
  •  1
  •   Mendelt    16 年前

    IEnumerable<object> FilteredList()
    {
        foreach( object item in FullList )
        {
            if( IsItemInPartialList( item )
                yield return item;
        }
    }
    
        5
  •  1
  •   Blair Conrad    16 年前

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

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

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

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