【发布时间】:2017-03-29 09:13:14
【问题描述】:
看起来哈希码问题和实现你自己的相等逻辑已经被打死了,但我似乎找不到明确的答案。
按照MSDN documentation 的建议,我有一个覆盖 Equals、GetHashCode、== 和 != 的自定义对象 (Step)。这个对象本身就可以正常工作;将 Step 与 Step 进行比较时,相等运算符按预期工作。请注意,我所说的相等是指 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();
}
请注意,除了 Delay 和 Index 之外,所有这些属性都是引用类型,而不是值类型(如果有区别的话)。并回答某人的问题:不,我正在比较的两个列表绝对不是相同的参考。它们是两个单独的列表。也许这就是我的问题。
【问题讨论】:
-
仅凭那一小段代码很难分辨。请提供minimal reproducible example。
-
为了消除您的恐惧,它应该有效。因此,您的代码中必须存在错误。您显示的小代码可能表明具有不同顺序的相同对象的两个列表会产生相同的哈希码,但除此之外,我们无法告诉您为什么它在特定情况下起作用或不起作用,因为没有' t 足够的代码来分析。请发布 minimal reproducible example 以及您希望代码具有的行为(它没有)。
-
你能发布 Step.GetHashCode() 实现吗?
-
您确定列表引用的是相同的对象吗?
标签: c# .net equality overriding gethashcode