GetHashCode与泛型集合返回不同的值
本文关键字:返回 泛型 集合 GetHashCode | 更新日期: 2023-09-27 18:18:11
看起来哈希码问题和实现你自己的相等逻辑已经被打死了,但我似乎找不到一个明确的答案。
我有一个自定义对象(Step),它覆盖了MSDN文档中建议的Equals、GetHashCode、==和!=。这个物体本身工作得很好;当一个步骤与另一个步骤进行比较时,相等运算符按预期工作。注意,这里的相等指的是Step的属性值,而不是引用相等。
我有第二个对象(Steps),它将Step对象存储在泛型列表中。现在我想看看Step对象列表是否等于另一个Step对象列表。在Steps对象中,我像在Step中那样覆盖了各种方法和操作符。对于GetHashCode重写,我遍历Step列表并组合散列代码:
foreach(var step in steplist.Steps)
{
hash += step.GetHashCode()
}
return hash
简单。但这行不通。具有相等Step对象值的两个独立列表的哈希码返回不同的哈希码。我假设我没有正确地实现哈希码覆盖。
我已经准备好硬编码返回的哈希码为零,然后收工。如有任何见地,不胜感激。
编辑:对不起,我想尽量简短,以免文字过多。下面是为Step对象生成的散列代码。什么是重写System.Object.GetHashCode的最佳算法?:
public override int GetHashCode()
{
return new { StepType, Color, Trigger, Delay, Index }.GetHashCode();
}
请注意,除了Delay和Index之外,所有这些属性都是引用类型,而不是值类型。回答某人的问题:不,我比较的两个列表绝对不是相同的参考文献。它们是两个独立的列表。也许这就是我的问题所在。
您需要为StepType
, Color
和Trigger
显示GetHashCode()
的代码,以确定,但如果它们不是相同的引用,并且您正在使用GetHashCode()
的默认实现用于这些类型,那么具有不同的引用会导致生成不同的哈希码