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之外,所有这些属性都是引用类型,而不是值类型。回答某人的问题:不,我比较的两个列表绝对不是相同的参考文献。它们是两个独立的列表。也许这就是我的问题所在。

GetHashCode与泛型集合返回不同的值

您需要为StepType, ColorTrigger显示GetHashCode()的代码,以确定,但如果它们不是相同的引用,并且您正在使用GetHashCode()的默认实现用于这些类型,那么具有不同的引用会导致生成不同的哈希码