我有一个类,在下面显示,用作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();
}
}
}
在有人问之前,是的,这些值都在字典中!
答案 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()方法以及中提琴,键查找工作正常。