看起来哈希码问题和实现你自己的平等逻辑已被打死,但我似乎无法找到明确的答案。
我有一个自定义对象(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();
}
请注意,除延迟和索引外,所有这些属性都是引用类型,而不是值类型(如果这会产生影响)。并回答某人的问题:没有我比较的两个清单肯定不是相同的参考。它们是两个单独的列表。也许这就是我的问题。
答案 0 :(得分:0)
您需要为GetHashCode()
,StepType
和Color
显示Trigger
的代码以确定无疑,但如果它们不是相同的引用,那么您是对这些类型使用GetHashCode()
的默认实现,然后使用不同的引用会导致生成不同的哈希码。