【问题标题】:GetHashCode issueGetHashCode 问题
【发布时间】:2009-10-13 14:59:46
【问题描述】:

任何人都可以帮助解释以下内容。我遇到了一个字典问题,其中 ContainsKey 评估为 false 而 EqualsGetHashCode 对于对象都是成功的。下面是 Visual Studio 中即时窗口的输出:

?LocationToRackingGroup.Keys.ToArray()[23].Equals(location)
true
?LocationToRackingGroup.Keys.ToArray()[23] == (location)
true
?this.LocationToRackingGroup.ContainsKey(location)
false

我错过了什么吗?任何想法都非常感谢。

【问题讨论】:

    标签: c# .net equals hashcode


    【解决方案1】:

    位置是可变的吗? 因为如果是的话,自从你把它放进字典后,它可能已经改变了。

    【讨论】:

      【解决方案2】:

      好吧,我想看看几件事:

      1:GetHashCode 是否正确实施:

      ?LocationToRackingGroup.Keys.ToArray()[23].GetHashCode() == location.GetHashCode()
      

      2:如果这是通用字典,该类型是否也(显式)实现IEquatable<Location>

      3:您是否在构造函数中为字典提供了自定义IEqualityComparer<Location>

      要排除最后一个,也许看看:

      ?LocationToRackingGroup.Comparer.Equals(blah23, location); // should be true
      ?LocationToRackingGroup.Comparer.GetHashCode(blah23);  // should equal below
      ?LocationToRackingGroup.Comparer.GetHashCode(location);// should equal above
      

      【讨论】:

      • 感谢您的快速回复: 1. GetHashCode 对两者都是平等的,我的意思是要包括那个对不起: ?LocationToRackingGroup.Keys.ToArray()[23].GetHashCode() 973699796 location.GetHashCode() 973699796 2. 我没有明确地实现 IEquatable,但刚刚尝试过,恐怕没有任何区别。 3. 我不认为这应该有所作为。如果我是正确的,它应该使用已被覆盖的默认 IEqualityComparer Equals。还有其他想法吗?
      • 你看过罗伯特的回答吗?除此之外,我们可能需要一些可重现的东西。
      【解决方案3】:

      好的,这是一个很长的镜头。

      前两行引用LocationToRackingGroup,最后一行引用this.LocationToRackingGroup,它们是同一个变量吗?

      【讨论】:

        【解决方案4】:

        规则是相同数据的每个“实例”的哈希码必须相同。如果它改变了,那么你的哈希函数就坏了。

        IOW,最安全的哈希函数是:

        int GetHashcode()
        {
          return 0;
        }
        

        【讨论】:

        • 这破坏了哈希码方法的用处,但在技术上是合法的实现;尝试此调试可能会有所帮助
        猜你喜欢
        • 2010-11-03
        • 2011-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-03
        • 2012-07-13
        • 1970-01-01
        • 2016-06-30
        相关资源
        最近更新 更多