2009-04-08 4 views
7

List<T>Containsメソッドをオーバーライドするにはどうすればいいですか?Tは自分のカスタムタイプですか?.NET汎用リストをオーバーライド<MyType> .Contains(MyTypeInstance)?

+0

あなたの質問から、あなたが達成する必要があるのは少し不明です。あなたはa)標準を必要としますか?あなたのカスタムタイプを扱うために含まれていますか?b)Containsが呼び出されたときに特別なロジックをしますか? –

+0

Peter、基本的にはリスト私は実行時にメモリにないので、OODBMSには弱く/弱い参照があります。私がネイティブの.netを実行すると、リストに含まれています。これは、oodbmsバックエンドからリスト全体を取得し、ローカルで評価します。したがって、私は正しい(バックエンド)クエリ構文でそれを上書きしたいと思っていました。 –

+0

@Jörg - そのことを念頭に置いて、Equals/GetHashCodeをオーバーライドするとどのように問題を解決できますか? –

答えて

5

に動作しますが含まれています。そうすれば、あなたのクラスはIListのように見えます。あなたは標準のものを行うために内部的に本当のリストを持つことができます。

class MyTypeList : IList<MyType> 
{ 
    private List<MyType> internalList = new ...; 

    public bool Contains(MyType instance) 
    { 

    } 

    .... 
} 
2

クラス内でEqualsGetHashCodeを無効にする必要があります(MyType)。

0

あなたの対等にカスタムタイプを実装する場合は、リストの機能は、独自のは、あなたがIListインターフェイスを実装するクラスを作成することができ、実装が含まれていることを確認するには

+0

いいえ、リストは決して==演算子を使用しません。 only equal –

+0

しかし、それはdownvoteに値するとは思わない。等しいは真です; @(1) –

7

List<T>比較を行うためにEqualityComparer<T>.Defaultを使用しています。まず、オブジェクトがIEquatable<T>を実装しているかどうかを確認します。そうでない場合はobject.Equalsが使用されます。

So;最も簡単な方法は、Equals(常にGetHashCodeを更新してEqualsのロジックに一致させる)です。また、代わりにLINQを使用します。

bool hasValue = list.Any(x => x.Foo == someValue); 
+0

@Marc Gravell:プロパティとフィールドだけを含む2つのカスタムクラスの「等価性」をテストしたい場合は、クラスにIEquatableを実装する必要がありますか?フィールドが各クラスに同じ値を含んでいたからといって、2つのクラスが「等しい」とみなされるという前提を立てたとき、私は本当に疲れていたに違いない。 :/ ...チップのおかげで); – IAbstract

+0

@Marc Gravell:まあ、技術的には、それが何を含むかは関係ありません。重要なのは、IEquatable を正しく実装し、別のMyClassが等しいかどうかを決定するフィールドを選択することです。 – IAbstract

+0

@dboarman - 正確に。あなたの最初のポイントは、IIRCは* do *のように動作するので、あなたは100万マイルも離れていませんでした。 –

1

をあなたはそれを行うためにLINQの式を使用する場合がありますオーバーライドを持っている必要があるか、特定の依存:

list.Any(x => x.Name.Equals("asdas", .....)) // whatever comparison you need 

あなたはその後、便宜のために拡張メソッドでそれをラップすることができます。

関連する問題