带有通用集合的GetHashCode返回不同​​的值

时间:2016-11-15 13:10:07

标签: c# .net equality method-overriding gethashcode

看起来哈希码问题和实现你自己的平等逻辑已被打死,但我似乎无法找到明确的答案。

我有一个自定义对象(Step),它覆盖了MSDN documentation建议的Equals,GetHashCode,==和!=。这个对象本身工作正常;将步骤与步骤进行比较时,相等运算符按预期工作。请注意,通过相等,我指的是Step的属性的值,而不是引用相等。

我有第二个对象(Steps),它将Step对象存储在通用列表中。现在我想查看Step对象列表是否等于另一个Step对象列表。在Steps对象中,我像在Step中一样覆盖了各种方法和操作符。对于GetHashCode覆盖,我遍历Step列表并组合哈希码:

foreach(var step in steplist.Steps)
{
    hash += step.GetHashCode()
}
return hash

简单。但它不起作用。具有相等Step对象值的两个单独列表的哈希码返回不同的哈希码。我假设我没有正确实现哈希码覆盖。

我准备好将返回的哈希码硬编码为零并将其称为一天。任何见解都表示赞赏。

编辑:

对不起,我试图做一些简短的文章,以避免一面文字。以下是Step对象的哈希码生成。取自What is the best algorithm for an overridden System.Object.GetHashCode?

public override int GetHashCode()
{
     return new { StepType, Color, Trigger, Delay, Index       }.GetHashCode();
}

请注意,除延迟和索引外,所有这些属性都是引用类型,而不是值类型(如果这会产生影响)。并回答某人的问题:没有我比较的两个清单肯定不是相同的参考。它们是两个单独的列表。也许这就是我的问题。

1 个答案:

答案 0 :(得分:0)

您需要为GetHashCode()StepTypeColor显示Trigger的代码以确定无疑,但如果它们不是相同的引用,那么您是对这些类型使用GetHashCode()的默认实现,然后使用不同的引用会导致生成不同的哈希码。