10

内部 IList<> を公開するクラス プロパティがあります。

System.Collections.ObjectModel.ReadOnlyCollection<>

要素を新しい配列にコピーせずにこの一部を渡すにはどうすればよいですかReadOnlyCollection<>(ライブ ビューが必要で、ターゲット デバイスのメモリが不足しています)。Compact Framework 2.0 をターゲットにしています。

4

6 に答える 6

15

yield を使用して列挙を返すメソッドを試してください。

IEnumerable<T> FilterCollection<T>( ReadOnlyCollection<T> input ) {
    foreach ( T item in input )
        if (  /* criterion is met */ )
            yield return item;
}
于 2008-09-02T13:11:08.867 に答える
8

これらの foreach サンプルは問題ありませんが、.NET 3.5 と LINQ を使用している場合は、もっと簡潔にすることができます。

return FullList.Where(i => IsItemInPartialList(i)).ToList();
于 2008-09-02T13:17:10.303 に答える
1

インデックスを変換した後、いつでも IList を実装し、すべての呼び出しを元のリストに転送するクラスを作成できます (そのため、データの独自のコピーはありません)。

于 2008-09-02T13:09:28.993 に答える
1

yield return を使用して、フィルタリングされたリストを作成できます

IEnumerable<object> FilteredList()
{
    foreach( object item in FullList )
    {
        if( IsItemInPartialList( item )
            yield return item;
    }
}
于 2008-09-02T13:10:00.100 に答える
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
}
于 2008-09-02T13:11:46.320 に答える
0

フィルタリングされた要素にどのようにアクセスする必要がありますか? Iterator を使用する場合は、公開したくない要素をスキップするカスタム イテレータを作成できますか?

Collection を提供する必要がある場合は、独自の Collection クラスを作成する必要がある場合があります。これは、基になる Collection にプロキシするだけで、公開したくない要素へのアクセスを防ぎます。

(免責事項: 私は C# にあまり詳しくないので、これらは一般的な回答です。より適切に機能する C# に対するより具体的な回答があるかもしれません)

于 2008-09-02T13:10:27.510 に答える