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

我有一个类,在下面显示,它用作Dictionary的键Dictionary我在尝试查找此字典中的任何键时遇到问题,它根本找不到它。 如您所见,我已经覆盖了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 { 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。 如果不使用EqualityComparer构造Dictionary,则不会使用它。

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

看起来你正在比较两个字符串。 Iirc,当使用.Equals()时,你正在比较字符串的引用,而不是实际的内容。 要实现使用字符串的EqualityComparer,您可能希望使用String.Compare()方法。

 public class EqualityComparer : IEqualityComparer { 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 } 

我可能会对代码有点偏僻,这应该让你接近…

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

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