2

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

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

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

4

4 回答 4

6

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

于 2009-10-13T15:03:32.703 回答
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
于 2009-10-13T15:04:25.563 回答
1

好的,这是一个长镜头。

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

于 2009-10-13T15:12:40.320 回答
0

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

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

int GetHashcode()
{
  return 0;
}
于 2009-10-13T15:08:14.543 回答