【问题标题】:Dictionary class in C# - Equality of two objectC# 中的字典类 - 两个对象的相等性
【发布时间】:2011-01-04 16:04:50
【问题描述】:

我有一个名为 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

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

【问题讨论】:

  • 您是否也为您的班级覆盖了 GetHashcode?​​span>

标签: c# dictionary equals


【解决方案1】:

2 种可能性:

  1. GetHashCode 未被正确覆盖。你可能想看看Why is it important to override GetHashCode when Equals method is overriden in C#?
  2. OBJ1 在以影响其哈希码的方式添加到字典后已发生突变。在这种情况下,它所在的存储桶将不再正确 - ContainsKey 最终会在不同的存储桶中寻找它。

来自Dictionary&lt;TKey, TValue&gt;

只要一个对象被用作键 在字典中,它 不得以任何方式改变 影响其哈希值。

【讨论】:

    【解决方案2】:

    您可能没有以与Equals 一致的方式覆盖GetHashCode

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

    IIRC,如果您在不覆盖 GetHashCode() 的情况下覆盖 Equals,则会收到编译器错误(或至少是警告)。

    另一种可能性是您实际上并没有overridden Equals,而是通过添加新签名重载它,例如

    public bool Equals(Class1 other)
    

    一般来说,要提供“自然”的值相等比较,您应该:

    • 覆盖等于(对象)
    • 覆盖 GetHashCode
    • 强烈考虑实施IEquatable&lt;T&gt;
    • 考虑重载 == 和 !=

    【讨论】:

      【解决方案3】:

      您可能没有在课堂上覆盖 GetHashcode。当您覆盖 Equals 时,您也必须覆盖 GetHashcode,否则 Dictionary 将无法为您工作。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 非常感谢您的帮助。它是固定的。
        【解决方案5】:

        您是否也覆盖了 GetHashCode ? 你能展示一下 Equals 方法的实现吗?

        【讨论】:

          【解决方案6】:

          您是否也覆盖了GetHashCode

          【讨论】:

            【解决方案7】:

            您还需要覆盖GetHashCode,但也不要忘记您可能还需要将自定义比较器传递给字典构造函数as pointed out in this SO question

            【讨论】:

              猜你喜欢
              • 2016-09-07
              • 1970-01-01
              • 2015-07-19
              • 2016-04-18
              • 2023-04-11
              • 2010-09-24
              • 1970-01-01
              • 2010-09-17
              相关资源
              最近更新 更多