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

Mas*_*oud 4 c# dictionary equals

我有一个名为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
Run Code Online (Sandbox Code Playgroud)

为什么会这样?任何帮助都会受到高度欢迎

Ani*_*Ani 13

2种可能性:

  1. GetHashCode没有被正确覆盖.您可能想看看为什么在C#中覆盖Equals方法时重写GetHashCode很重要?
  2. OBJ1在以影响其哈希码的方式添加到字典中之后,它已经发生了变异.在这种情况下,它所放置的铲斗将不再正确 - ContainsKey最终将在另一个铲斗中寻找它.

来自Dictionary<TKey, TValue>:

只要对象在Dictionary中用作键,就不能以任何影响其哈希值的方式进行更改.


Jon*_*eet 12

你有可能没有GetHashCode以符合的方式覆盖Equals.

合同GetHashCode要求if OBJ1.Equals(OBJ2)返回true,则OBJ1.GetHashCode()必须返回相同的值OBJ2.GetHashCode().

IIRC,如果覆盖Equals而没有覆盖,则会出现编译器错误(或至少是警告)GetHashCode().

另一种可能性是你实际上没有overridden Equals,但是通过添加新的签名来重载它,例如

public bool Equals(Class1 other)
Run Code Online (Sandbox Code Playgroud)

一般来说,要提供"自然"价值平等比较,您应该:

  • 覆盖等于(对象)
  • 覆盖GetHashCode
  • 强烈考虑实施 IEquatable<T>
  • 考虑重载==和!=