質問

以下に示すクラスがあり、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();
      }
   }
}

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

役に立ちましたか?

解決

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

他のヒント

EqualsとGetHashCodeをオーバーライドしていない。 EqualityComparerとして機能できる2番目のクラスを実装しました。 EqualityComparerで辞書を作成しない場合、使用されません。

最も単純な修正は、比較器を実装するのではなく、GetHashCodeとEqualsを直接オーバーライドすることです(比較器は、通常、複数の異なる比較タイプ(大文字と小文字を区別しない、大文字と小文字を区別しないなど)制御していないクラスで比較を実行します。

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
}

コードに少し余裕があるかもしれませんが、それはあなたを近づけるはずです...

この問題が発生しました。辞書では、オブジェクトの値ではなく、キーの参照を比較していました。

カスタムPointクラスをキーとして使用していました。 ToString()およびGetHashCode()メソッドとビオラをオーバーライドしました。キールックアップは正常に機能しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top