自定义类在词典中用作键但未找到键

时间:2009-10-27 18:27:41

标签: c# dictionary override containskey

我有一个类,在下面显示,用作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();
      }
   }
}

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

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:6)

您尚未覆盖Equals和GetHashCode。您已经实现了第二个类,可以作为EqualityComparer。如果不使用EqualityComparer构造Dictionary,则不会使用它。

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

答案 2 :(得分: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
}

我可能会对代码有所帮助,这应该让你接近......

答案 3 :(得分:0)

我遇到了这个问题,结果是字典正在比较我的密钥的referances,而不是对象中的值。

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