2012-11-06 53 views
4

我正在爲LINQ獨特表達式寫一個EqualityComparer,我不太確定GetHashCode重載方法。下面的代碼是否正確? Id屬性是一個很長的原始。長基元GetHashCode()

public int GetHashCode(Deal obj) 
{ 
    return ((int)obj.Id)^((int)(obj.Id >> 32)); ; 
} 
+5

答案取決於您在「等於」方法中比較的內容。爲什麼不只是'返回obj.Id.GetHashCode()'? –

+0

我只是比較==運算符的等於方法。我並不需要在我的上下文中使用哈希碼,但我只是希望澄清一下這個長期的原始碼,因爲它存在精度損失。 – yulun

+1

用==比較什麼? 'Id'?如果是這樣,你很好,但'obj.Id.GetHashCode()'會更簡單。我的觀點是,有一些不變式'GetHashCode'和'Equals'必須滿足'IEqualityComparer'合約的一部分。特別是,'GetHashCode(x)!= GetHashCode(y)'意味着'Equals(x,y)'是假的。 LINQ'Distinct'方法要求兩者都要正確實現。如果您有興趣,Eric Lippert列出了詳盡的指南:http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx –

回答

9

可能您應該檢查obj是否爲空。在無返回的情況下0。老實說你的long Id的實現與.NET Framework GetHashCodelong數據類型完全相同。換句話說,您可以簡單地在非空檢查後調用obj.Id.GetHashCode()