2

誰かが次のことを説明するのを手伝ってもらえますか?オブジェクトとオブジェクトの両方が成功しているContainsKeyときにfalseと評価される辞書に問題があります。以下は、VisualStudioのイミディエイトウィンドウからの出力です。EqualsGetHashCode

?LocationToRackingGroup.Keys.ToArray()[23].Equals(location)
true
?LocationToRackingGroup.Keys.ToArray()[23] == (location)
true
?this.LocationToRackingGroup.ContainsKey(location)
false

私は何かが足りないのですか?どんなアイデアでも大歓迎です。

4

4 に答える 4

6

場所は変更可能ですか? もしそうなら、辞書に入れてから変更された可能性があるからです.

于 2009-10-13T15:03:32.703 に答える
3

さて、私はいくつかのことを見たいと思います:

1:GetHashCode正しく実装されています:

?LocationToRackingGroup.Keys.ToArray()[23].GetHashCode() == location.GetHashCode()

2: これがジェネリック ディクショナリの場合、型も (明示的に) 実装しますか?IEquatable<Location>

IEqualityComparer<Location>3:コンストラクターで辞書にカスタムを指定しましたか?

最後を除外するには、おそらく次を見てください。

?LocationToRackingGroup.Comparer.Equals(blah23, location); // should be true
?LocationToRackingGroup.Comparer.GetHashCode(blah23);  // should equal below
?LocationToRackingGroup.Comparer.GetHashCode(location);// should equal above
于 2009-10-13T15:04:25.563 に答える
1

OK、これはロングショットです。

あなたが参照する最初の 2 行とLocationToRackingGroup最後の tothis.LocationToRackingGroupでは、それらは同じ変数ですか?

于 2009-10-13T15:12:40.320 に答える
0

ルールは、同じデータのすべての「インスタンス」に対してハッシュコードが同じでなければならないということです。変更された場合、ハッシュ関数が壊れています。

IOW、最も安全なハッシュ関数は次のとおりです。

int GetHashcode()
{
  return 0;
}
于 2009-10-13T15:08:14.543 に答える