T
コレクションのキーとして使用したいクラスがあるとしDictionary<T,U>
ます。
これらのキーが参照ではなくT
の値に基づくようにするには、何を実装する必要がありますか?T
T
私はそれがただであることを望んでいGetHashCode()
ます。
T
コレクションのキーとして使用したいクラスがあるとしDictionary<T,U>
ます。
これらのキーが参照ではなくT
の値に基づくようにするには、何を実装する必要がありますか?T
T
私はそれがただであることを望んでい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でこの記事を読んでください。