GetHashCode问题

时间:2009-10-13 14:59:47

标签: c# .net equals hashcode

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

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

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

4 个答案:

答案 0 :(得分:6)

位置是否可变? 因为如果它,它可能已经改变,因为你把它放入字典。

答案 1 :(得分:3)

好吧,我想看几件事:

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

答案 2 :(得分:1)

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

在前两行中,您引用LocationToRackingGroup,在最后一行引用this.LocationToRackingGroup,它们是相同的变量吗?

答案 3 :(得分:0)

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

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

int GetHashcode()
{
  return 0;
}