它看起来像哈希代码问题,并实现自己的相等逻辑已被击败致死,但我似乎无法找到明确的答案。具有泛型集合的GetHashCode返回不同的值
我有一个自定义对象(步骤),覆盖Equals,GetHashCode,==,和!= MSDN documentation建议。这个对象本身工作正常;将步骤与步骤进行比较时,等式运算符按预期工作。请注意,通过平等,我指的是Step的属性的值,而不是引用相等。
我有第二个对象(步骤),将步骤对象存储在通用列表中。现在我想查看Step对象列表是否与另一个Step对象列表相同。在Steps对象中,我重写了在Step中完成的各种方法和操作符。对于GetHashCode覆盖,我遍历步骤列表并组合散列代码:
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();
}
注意,所有这些特性,除了延迟和指数,是引用类型,不是值类型,如果有差别。并回答某人的问题:不,我比较的两个名单绝对不是同一个参考。他们是两个单独的名单。也许这就是我的问题。
用这么小的一段代码很难分辨出来。请提供[mcve]。 –
为了让你的恐惧休息,**它应该工作**。因此,您的代码中必须有一个错误。你显示的小代码可能表明,具有相同对象的两个列表以不同的顺序产生相同的哈希代码,但除此之外,我们可以告诉你为什么它在特定情况下工作或不工作,因为没有“足够的代码来分析。请发布[mcve]以及您希望代码具有的行为(它不会)。 –
你可以发布Step.GetHashCode()实现吗? –