2009-10-27 6 views
9

私は以下のクラスを持っていますが、Dictionary<ValuesAandB, string>のキーとして使用されています この辞書内のキーを見つける際に問題があります。それはまったくありません。ご覧のとおり、私はEqualsGetHashCodeを上書きしました。私は辞書のキーとして使用されているキーが見つかりませんでした

ValuesAandB key = new ValuesAandB(A,B); 
if (DictionaryName.ContainsKey(key)) { 
    ... 
} 

を使用しているキーを探すために

は私が欠けている何か他のものはありますか?誰かが間違っていることを指摘できますか?

private class ValuesAandB { 
    public string valueA; 
    public string valueB; 

    // Constructor 
    public ValuesAandB (string valueAIn, string valueBIn) { 
    valueA = valueAIn; 
    valueB = ValueBIn; 
    } 

    public class EqualityComparer : IEqualityComparer<ValuesAandB> { 
     public bool Equals(ValuesAandB x, ValuesAandB y) { 
     return ((x.valueA.Equals(y.valueA)) && (x.valueB.Equals(y.valueB))); 
     } 
     public int GetHashCode(ValuesAandB x) { 
     return x.valueA.GetHashCode()^x.valueB.GetHashCode(); 
     } 
    } 
} 

誰かが尋ねる前に、値は辞書にあります!

答えて

9

どのように辞書を構築していますか?カスタムequality比較関数をコンストラクタに渡していますか?

6

あなたはEqualsとGetHashCodeをオーバーライドしていません。 EqualityComparerとして機能することができる2番目のクラスを実装しました。 EqualityComparerで辞書を構築しないと、それは使用されません。

最も単純な修正は、比較演算子を実装するのではなく、GetHashCodeとEqualsを直接オーバーライドすることです(比較関数は一般的に複数の異なる比較タイプを指定する必要がある

+0

はい、あなたの前に取られたコメントと正解は判明しましたが、グレッグビーチはあなたを先に受け入れました。 助けてくれてありがとう。 –

1

2つの文字列を比較しているように見えます.Iquals()を使用すると、実際の内容ではなく文字列の参照が比較されます文字列で動作するEqualityComparerを実装するには、String.Compare()メソッドを使用します。

public class EqualityComparer : IEqualityComparer<ValuesAandB> 
{ 
    public bool Equals(ValuesAandB x, ValuesAandB y) 
    { 
      return ((String.Compare(x.valueA,y.valueA) == 0) && 
      (String.Compare(x.valueB, y.valueB) == 0)); 
    } 
    // gethashcode stuff here 
} 

が、私はこの問題を持っていたあなたが近づくはずですコード、...

+0

いいえ、String.Equals(String)はここで呼び出されるオーバーロードで、内容を明示的に比較します。そして、どんな場合でも、String.Equals(Object)は同じことをするためにオーバーライドされます。 –

+0

* facepalm *私は何を考えていたのか分かりません。 – cloggins

0

で少しオフにすることができ、辞書は私のキー、オブジェクトではない値のためreferancesを比較したが判明しました。

私はカスタムPointクラスをキーとして使用していました。私はToString()メソッドとGetHashCode()メソッドをオーバーライドし、ビオラ、キーの検索はうまくいきました。

関連する問題