2016-11-15 62 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()這些類型的默認實現,那麼具有不同的引用會導致不同哈希碼將被生成。