IList<> のフラグメントのみを公開するにはどうすればよいですか?
-
09-06-2019 - |
質問
内部 IList<> を公開するクラス プロパティがあります。
System.Collections.ObjectModel.ReadOnlyCollection<>
この一部を渡すにはどうすればよいですか ReadOnlyCollection<>
要素を新しい配列にコピーせずに (ライブビューが必要ですが、ターゲットデバイスのメモリが不足しています)?Compact Framework 2.0 をターゲットにしています。
解決
yield を使用して列挙を返すメソッドを試してください。
IEnumerable<T> FilterCollection<T>( ReadOnlyCollection<T> input ) {
foreach ( T item in input )
if ( /* criterion is met */ )
yield return item;
}
他のヒント
これらの foreach サンプルは問題ありませんが、.NET 3.5 と LINQ を使用している場合は、より簡潔にすることができます。
return FullList.Where(i => IsItemInPartialList(i)).ToList();
IList を実装し、インデックスの変換後にすべての呼び出しを元のリストに転送する (つまり、データの独自のコピーを持たない) クラスをいつでも作成できます。
yield return を使用してフィルタリングされたリストを作成できます
IEnumerable<object> FilteredList()
{
foreach( object item in FullList )
{
if( IsItemInPartialList( item )
yield return item;
}
}
コレクションをどのようにフィルター処理する必要があるかによっては、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
}
フィルターされた要素にはどのようにアクセスする必要がありますか?Iterator を使用する場合は、公開したくない要素をスキップするカスタム Iterator を作成できるでしょうか。
Collection を提供する必要がある場合は、独自の Collection クラスを記述する必要がある場合があります。このクラスは、基になる Collection にプロキシするだけで、公開したくない要素へのアクセスを防ぎます。
(免責事項:私は C# にあまり詳しくないので、これらは一般的な答えです。C# には、より適切に機能する、より具体的な答えがあるかもしれません)