0

わかった。

クラス MyClass と、List に基づく別のクラスがあります。それを MyCollection と呼びましょう。

誰かがタイプすると:

MyCollection coll = new MyCollection();
...
coll.Find(...)

彼らはコレクション全体に作用しています。舞台裏でフィルタリングを適用したいので、上記のコードを記述した場合、実際に実行されるのは次のようなものです...

coll.Where(x=>x.CanSeeThis).Find(...)

これを機能させるには、MyCollection クラスの定義に何を書く必要がありますか?

これを機能させることはできますか?

4

2 に答える 2

3

内部で正規を使用して、IListorを実装するラッパー クラスを作成することをお勧めします。このラッパー クラスは、すべてのメソッド呼び出しを内部リストにプロキシし、必要に応じてフィルターを適用します。ICollectionList

于 2011-01-25T11:51:08.067 に答える
1

あなたはすでにリストから派生した独自のコレクションを持っていると言いましたよね? 次に、以下を見つけるための独自の方法を作成する必要があります。

public class MyList<T> : System.Collections.Generic.List<T>
{
  public IEnumerable<T> MyFind(Predicate<T> match)
  {
    return this.Where(x => x.CanSeeThis).ToList().Find(match);
  }
}

残念ながら、List の Find メソッドを直接オーバーライドできないため、これが必要になります。ただし、「new」キーワードを使用して、MyList のインスタンスへの参照を取得した場合、次のようにその実装の find を使用することを指定できます。

  public new IEnumerable<T> Find(Predicate<T> match)
  {
    return this.Where(x => x.CanSeeThis).ToList().Find(match);
  }

ただし、上記の例では次の結果が得られます。

MyCollection<int> collection = new ...
collection.Find(myPredicate); // <= Will use YOUR Find-method

List<int> baseTypeCollection = collection; // The above instantiated
baseTypeCollection.Find(myPredicate); // Will use List<T>.Find!

だから、独自の方法を作るほうがいいです。

于 2011-01-25T11:59:42.310 に答える