辞書でキーとして使用されているカスタムキーが見つかりません
-
06-07-2019 - |
質問
以下に示すクラスがあり、Dictionary<ValuesAandB, string>
のキーとして使用されます
このディクショナリ内でキーを見つけようとすると問題が発生します。まったく見つかりません。ご覧のとおり、Equals
とGetHashCode
をオーバーライドしました。
使用しているキーを探す
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()メソッドとビオラをオーバーライドしました。キールックアップは正常に機能しました。