10

以下に示すクラスがあり、Dictionary<ValuesAandB, string> このディクショナリ内でキーを見つけようとすると問題が発生し、まったく見つかりません。ご覧のとおり、 and をオーバーライド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();
      }
   }
}

そして、誰かが尋ねる前に、はい、値はディクショナリにあります!

4

4 に答える 4

9

辞書はどのように作成していますか?カスタムの等値比較子をそのコンストラクターに渡していますか?

于 2009-10-27T18:41:41.570 に答える
7

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

最も簡単な修正方法は、比較子を実装するのではなく、GetHashCode と Equals を直接オーバーライドすることです (比較子は通常、複数の異なる比較タイプ (大文字と小文字を区別する場合と区別しない場合など) を指定する必要がある場合、または比較を実行できるようにする必要がある場合にのみ興味深いものです)。あなたが制御しないクラスで。

于 2009-10-27T18:37:12.403 に答える
1

私はこの問題を抱えていました。辞書は、オブジェクトの値ではなく、キーの参照を比較していたことがわかりました。

カスタム Point クラスをキーとして使用していました。ToString() および GetHashCode() メソッドとビオラを上書きしました。キー検索は正常に機能しました。

于 2009-10-27T18:38:44.010 に答える
0

2 つの文字列を比較しているようです。Iirc、.Equals() を使用する場合、実際の内容ではなく、文字列の参照を比較しています。文字列で動作する 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
}

私はコードに少しずれている可能性があります。それはあなたに近づくはずです...

于 2009-10-27T18:37:29.160 に答える