10

我有一个类,如下所示,它用作Dictionary<ValuesAandB, string> 我在尝试在此字典中查找任何键时遇到问题的键,它根本找不到它。如您所见,我已经覆盖了Equalsand 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();
      }
   }
}

在有人问之前,是的,这些值在字典中!

4

4 回答 4

9

你是如何构建字典的?您是否将自定义相等比较器传递给其构造函数?

于 2009-10-27T18:41:41.570 回答
7

您没有覆盖 Equals 和 GetHashCode。您已经实现了可以用作 EqualityComparer 的第二个类。如果您不使用 EqualityComparer 构建 Dictionary,它将不会被使用。

最简单的解决方法是直接覆盖 GetHashCode 和 Equals 而不是实现比较器(比较器通常仅在您需要提供多种不同的比较类型(例如区分大小写和不区分大小写)或需要能够执行比较时才有意义在你无法控制的课程上。

于 2009-10-27T18:37:12.403 回答
1

我遇到了这个问题,原来字典是在比较我的键的引用,而不是对象中的值。

我使用自定义 Point 类作为键。我覆盖了 ToString() 和 GetHashCode() 方法和中提琴,键查找工作正常。

于 2009-10-27T18:38:44.010 回答
0

看起来您正在比较两个字符串。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 回答