2009-07-09 4 views
2

これはVB.NETです。someDictionary.ContainsKey(someDictionary.Keys.First)...はFalseですか?

タイトルに記載されている式がFalseを返す原因が考えられますか?私は確信して

もの:

  1. 辞書のキーがあります。
  2. 等価比較子は、各キーに対して異なるハッシュコードを返し、そのハッシュコードは常に同じ入力に対して同じです。
  3. someDictionary.Keys.Firstとキーに相当する新しく構築されたオブジェクトを比較すると、Trueが返されます。
  4. someDictionary.Comparer.Equals(someDictionary.Keys.First、newObjectThatIsEquivalentToFirstKey)はTrueを返します。
  5. someDictionary.Keys.First.GetHashCodeは常に同じ値を返します(複数のプログラム実行であっても)。繰り返し再作成された同等のオブジェクトでGetHashCodeを呼び出すと、GetHashCodeが呼び出されません。問題のオブジェクトは本質的に単なる4つ組のboolであり、ハッシュコードは新しいBitArray(新しいBoolean {}(obj.First、obj.Second、obj.Third、obj.Fourth))です。GetHashCode
  6. UPDATE:一つのスレッドだけ

更新:。。。どうやら、そのハッシュコードの実装は、常に同じ値を返しません。私はこれが問題であれば、診断しようとします

答えて

2

dict.ContainsKey(dict.Keys.First)を実行すると、Keys.Firstのハッシュコードがハッシュテーブルに格納されてから変更された場合はtrueを返しません。

2つの方法が別々のルックアップを使用するためです。 dict.Keys.Firstはハッシュコードに依存せず、おそらくこのアイテムが上にある任意の「ハッシュバケット」へのポインタに過ぎませんでした。

dict.ContainsKey()ただし、dict.Keys.Firstのハッシュコードが追加されてから変更されている場合は、別のハッシュバケットに属する可能性がありますが、これは反映または更新されませんハッシュテーブルに格納する。オブジェクトは辞書内で「失われる」。 (C#のが、VB.NETに並進、および未試験)

 
class Foo { 
    public int i; 

    public override int GetHashCode() { 
    return i.GetHashCode(); 
    } 
} 

var dictionary = new Dictionary<Foo,string>(); 
var foo = new Foo { i = 1; } 
dictionary.Add (foo, "I was wrong."); 
foo.i = 2; 
if (dictionary.ContainsKey (dictionary.Keys.First)) { 
    System.Console.WriteLine (dictionary[dictionary.Keys.First]); 
} else { 
    System.Console.WriteLine ("I was right."); 
} 
+0

。明らかにSometHingはありましたが、それは私のコードではありませんでした。それはBitArrayにあった。とにかく情報をありがとう。これは参考に便利です。 –

0

何の競合状態について

Keys.Firstが取得されてから、別のスレッドが辞書を変更した後、dictに対して評価が行われますその鍵なしで

+0

つのみのスレッド。確信に追加されました。 –

+0

あなたができることは、最初にcomparerにデバッグし、次に辞書で、ブレークポイントをContainsKey()に手動で追加して、何が起こっているか見ることができます。 (これは既に知っているかもしれませんが、VSではBreakpoints、New、Break at Functionを使って関数のフルネームを手動で書くことができます;それはかなり便利な機能です) – Ariel

0

したがって、ブール値の文字列値を連結したハッシュコードにハッシュコードを変更することで問題は解決しました。

奇妙なことに、私がプログラムを実行したとき、ハッシュコードは常に同じでしたが、デバッガのイミディエイトウィンドウを使ってハッシュコードを照会すると、それは常に異なっていました。

関連する問題