4
我正在爲LINQ獨特表達式寫一個EqualityComparer,我不太確定GetHashCode重載方法。下面的代碼是否正確? Id屬性是一個很長的原始。長基元GetHashCode()
public int GetHashCode(Deal obj)
{
return ((int)obj.Id)^((int)(obj.Id >> 32)); ;
}
我正在爲LINQ獨特表達式寫一個EqualityComparer,我不太確定GetHashCode重載方法。下面的代碼是否正確? Id屬性是一個很長的原始。長基元GetHashCode()
public int GetHashCode(Deal obj)
{
return ((int)obj.Id)^((int)(obj.Id >> 32)); ;
}
可能您應該檢查obj
是否爲空。在無返回的情況下0
。老實說你的long
Id的實現與.NET Framework GetHashCode
的long
數據類型完全相同。換句話說,您可以簡單地在非空檢查後調用obj.Id.GetHashCode()
。
答案取決於您在「等於」方法中比較的內容。爲什麼不只是'返回obj.Id.GetHashCode()'? –
我只是比較==運算符的等於方法。我並不需要在我的上下文中使用哈希碼,但我只是希望澄清一下這個長期的原始碼,因爲它存在精度損失。 – yulun
用==比較什麼? '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 –