Tコレクションのキーとして使用したいクラスがあるとしDictionary<T,U>ます。
これらのキーが参照ではなくTの値に基づくようにするには、何を実装する必要がありますか?TT
私はそれがただであることを望んでいGetHashCode()ます。
Tコレクションのキーとして使用したいクラスがあるとしDictionary<T,U>ます。
これらのキーが参照ではなくTの値に基づくようにするには、何を実装する必要がありますか?TT
私はそれがただであることを望んでいGetHashCode()ます。
GetHashCode()とEquals()を実装する必要があります。
辞書はカバーの下にあるハッシュテーブルなので、これを読むことをお勧めします:Pitfalls Of Equals / GetHashCode –ハッシュテーブルはどのように機能しますか?
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ます)。
マップに適切な形式の等式マッチングを備えた適切なものEqualsを実装GetHashCode または作成します。IEqualityComparer<T>
私はむしろIEqualityComparer<T>ルートが好きです。多くの場合、明らかに正しい形の平等は1つではありません。状況に応じて、さまざまな方法でオブジェクトを平等に扱いたいと考えています。その場合、カスタムの等式比較器がまさに必要なものです。もちろん、自然な等式演算がある場合は、型自体に実装するのが理にかなっていIEquatable<T>ます...可能であれば。(もう1つの利点はIEqualityComparer<T>、制御できないタイプに実装できることです。)
をオーバーライドする必要がありますEquals(object obj)。GetHashCodeを変更するときは、常に実装することが期待されますEquals。MSDNでこの記事を読んでください。