它看起來像哈希代碼問題,並實現自己的相等邏輯已被擊敗致死,但我似乎無法找到明確的答案。具有泛型集合的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()實現嗎? –