C#中的字典类 - 两个对象的相等性

4

我有一个名为Class1的类

我重写了它的Equals函数

现在我有一个Dictionary实例

我向其中添加了一个名为OBJ1的Class1实例

我还有另一个名为OBJ2的Class1实例

代码返回OBJ1.Equals(OBJ2)为true

但是我在字典中找不到OBJ2

这是伪代码:

Class1 OBJ1 = new Class1(x, y, z);
Class1 OBJ2 = new Class1(a, b, c);
Dictionary<Class1, int> dic1 = new Dictionary<Class1, int>();
dic1.Add(OBJ1, 3);
OBJ1.Equals(OBJ2) -------------> return true
Dictionary.ContainsKey(OBJ2) --------------> return false

为什么会发生这种情况呢?非常欢迎任何帮助。

4
你是否也覆写了你的类的GetHashCode方法? - BrokenGlass
7个回答

13

12

可能你还没有按照 Equals 一致的方式重写了 GetHashCode

GetHashCode 的契约要求如果 OBJ1.Equals(OBJ2) 返回 true,那么 OBJ1.GetHashCode() 必须返回与 OBJ2.GetHashCode() 相同的值。

如果你重写了 Equals 却没有重写 GetHashCode(),你可能会得到编译器错误(或者至少是警告)。

另一个可能性是你实际上并没有 overridden Equals,而是通过添加新的签名 overloaded 它,例如:

public bool Equals(Class1 other)

通常,为了提供“自然”的值相等比较,你应该:

  • 重写 Equals(object)
  • 重写 GetHashCode
  • 强烈考虑实现 IEquatable<T>
  • 考虑重载 == 和 !=

4

您的类可能没有重写GetHashcode方法。当您重写Equals方法时,必须同时重写GetHashcode方法,否则Dictionary将无法为您工作。


3

你是否也重写了 GetHashCode 方法? 能否展示 Equals 方法的实现?


3
你是否也覆盖了 GetHashCode 方法?

3

您需要重写GetHashCode方法,但是也不要忘记在Dictionary构造函数中可能需要传入自定义的比较器,正如这个SO问题所指出的。


3

请确保Class1覆盖了GetHashCode()方法。在比较相等性时,该方法的返回值是首先检查的。默认实现对于每个对象都是唯一的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接