2016-11-15 61 views
-2

它看起来像哈希代码问题,并实现自己的相等逻辑已被击败致死,但我似乎无法找到明确的答案。具有泛型集合的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(); 
} 

注意,所有这些特性,除了延迟和指数,是引用类型,不是值类型,如果有差别。并回答某人的问题:不,我比较的两个名单绝对不是同一个参考。他们是两个单独的名单。也许这就是我的问题。

+3

用这么小的一段代码很难分辨出来。请提供[mcve]。 –

+1

为了让你的恐惧休息,**它应该工作**。因此,您的代码中必须有一个错误。你显示的小代码可能表明,具有相同对象的两个列表以不同的顺序产生相同的哈希代码,但除此之外,我们可以告诉你为什么它在特定情况下工作或不工作,因为没有“足够的代码来分析。请发布[mcve]以及您希望代码具有的行为(它不会)。 –

+0

你可以发布Step.GetHashCode()实现吗? –

回答

0

你需要显示StepTypeColorTriggerGetHashCode()代码也肯定知道,但如果他们是不一样的引用和你正在使用的GetHashCode()这些类型的默认实现,那么具有不同的引用会导致不同哈希码将被生成。