ちょうどそれを明確にする:Dictionary<TKey, TValue>
とGetHashCode()
についての一つの重要な事があります:辞書決定するためGetHashCodeメソッドを使用して2つのキーが等しい場合、すなわち<TKey>
は、カスタム型である場合は、慎重にGetHashCode()
を実装する気にする必要があります。 Andrew Hare氏は、カスタムオブジェクトを明白に識別するシンプルなタイプがあれば、これは簡単だと指摘しました。結合された識別子がある場合は、もう少し複雑になります。
例として、複素数をTKey
と見なします。複素数は、実部と虚部によって決定されます。両方とも単純なタイプのものである。 double
。しかし、2つの複素数が等しいかどうかをどのように識別しますか?カスタム複合タイプにGetHashode()
を実装し、両方の識別パーツを結合します。
さらに詳しくは、hereを参照してください。 Ergwunさんのコメントに基づいて
UPDATE
私はEquals(object)
とGetHashCode()
のTKey
の実装に特別に関してDictionary<TKey, TValue>.Add
の動作を確認しました。私は は、私は結果にかなり驚いていたことを告白する必要があります。これはキーでd
第v2
にキーとv1
を追加するときに何が起こるかである二つのオブジェクト及びタイプTKey
のk2
、任意の二つのオブジェクトv1
及びタイプTValue
のv2
、及びタイプDictionary<TKey, TValue>
の空の辞書d
を考える
(TKey.Equals(object)
とTKey.GetHashCode()
の実装に応じて)k2
秒:
k1.Equals(k2) k1.GetHashCode() == k2.GetHashCode() d.Add(k2, v2)
false false ok
false true ok
true false ok
true true System.ArgumentException
コンclusion:最初は2番目のケース(Equals
がfalse
を返しますが、両方のキーオブジェクトが同じハッシュコードを持つと考えていたので間違っていました)はArgumentException
になります。しかし、3番目のケースは何らかの方法で辞書が表示されるので、GetHashCode()
を使用します。とにかく、同じ型で等しい2つのオブジェクトがインスタンスDictionary<TKey, TValue>
が正しく動作するように同じハッシュコードを返さなければならないというのは良いアドバイスと思われます。
の可能な複製[なぜEqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドするのが重要なのですか?](http://stackoverflow.com/questions/371328/why-is-it-important-to-override-gethashcode-when- equals-method-over-over) – nawfal