任何人都可以帮助解释以下内容。我遇到一个字典问题,其中ContainsKey
评估为false,而对象的Equals
和GetHashCode
成功。下面是Visual Studio中即时窗口的输出:
?LocationToRackingGroup.Keys.ToArray()[23].Equals(location)
true
?LocationToRackingGroup.Keys.ToArray()[23] == (location)
true
?this.LocationToRackingGroup.ContainsKey(location)
false
我错过了什么吗?任何想法都非常感激。
答案 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;
}