3

Tコレクションのキーとして使用したいクラスがあるとしDictionary<T,U>ます。

これらのキーが参照ではなくTの値に基づくようにするには、何を実装する必要がありますか?TT

私はそれがただであることを望んでいGetHashCode()ます。

4

4 に答える 4

5

GetHashCode()とEquals()を実装する必要があります。

辞書はカバーの下にあるハッシュテーブルなので、これを読むことをお勧めします:Pitfalls Of Equals / GetHashCode –ハッシュテーブルはどのように機能しますか?

于 2010-05-21T11:50:23.840 に答える
3

IEqualityComparer<T>辞書コンストラクターに何も渡さない場合はEqualityComparer<T>.Default、MSDNで次のように定義されているものが使用されます。

Defaultプロパティは、タイプTがSystem.IEquatable(Of T)インターフェイスを実装しているかどうかを確認し、実装している場合は、その実装を使用するEqualityComparer(Of T)を返します。それ以外の場合は、Tによって提供されるObject.EqualsおよびObject.GetHashCodeのオーバーライドを使用するEqualityComparer(Of T)を返します。

したがって、実装IEquatable<T>することが私の選択です(実装する場合は、オーバーライドすることも意味がEqualsありGetHashCodeます)。

于 2010-05-21T11:55:16.680 に答える
3

マップに適切な形式の等式マッチングを備えた適切なものEqualsを実装GetHashCode または作成します。IEqualityComparer<T>

私はむしろIEqualityComparer<T>ルートが好きです。多くの場合、明らかに正しい形の平等は1つではありません。状況に応じて、さまざまな方法でオブジェクトを平等に扱いたいと考えています。その場合、カスタムの等式比較器がまさに必要なものです。もちろん、自然な等式演算がある場合、型自体に実装するのが理にかなっていIEquatable<T>ます...可能であれば。(もう1つの利点はIEqualityComparer<T>、制御できないタイプに実装できることです。)

于 2010-05-21T11:55:32.330 に答える
2

をオーバーライドする必要がありますEquals(object obj)GetHashCodeを変更するときは、常に実装することが期待されますEquals。MSDNでこの記事を読んでください。

于 2010-05-21T11:51:08.533 に答える