【问题标题】:How can I expose only a fragment of IList<>?如何仅公开 IList<> 的片段?
【发布时间】:2010-09-07 13:19:48
【问题描述】:

我有一个通过

公开内部 IList 的类属性
System.Collections.ObjectModel.ReadOnlyCollection<>

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

【问题讨论】:

    标签: c# windows-mobile compact-framework .net-2.0


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

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

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

              如果您需要提供 Collection,那么您可能需要编写自己的 Collection 类,该类仅代理底层 Collection,但会阻止访问您不希望公开可见的元素。

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-03-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-12-16
                相关资源
                最近更新 更多