C# 用于长基元的GetHashCode()

C# 用于长基元的GetHashCode(),c#,.net,iequalitycomparer,C#,.net,Iequalitycomparer,我正在为LINQ distinct表达式编写一个EqualityComparer,但我不太确定GetHashCode重载方法。下面的代码正确吗?Id属性是一个长基元 public int GetHashCode(Deal obj) { return ((int)obj.Id) ^ ((int)(obj.Id >> 32)); ; } 可能您应该检查obj是否为空。如果为空,则返回0。老实说,longId的实现与long数据类型的.NET FrameworkGetHashCod

我正在为LINQ distinct表达式编写一个EqualityComparer,但我不太确定GetHashCode重载方法。下面的代码正确吗?Id属性是一个长基元

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

可能您应该检查
obj
是否为空。如果为空,则返回
0
。老实说,
long
Id的实现与
long
数据类型的.NET Framework
GetHashCode
完全相同。换句话说,在非空检查后,您只需调用
obj.Id.GetHashCode()

答案取决于您在
Equals
方法中比较的内容。为什么不
返回obj.Id.GetHashCode()
?我只是在比较Equals方法的==运算符。在我的上下文中,我并不真的需要hashcode,但我只是希望得到关于long原语的澄清,因为在精度上有损失。与
==
相比,什么?
Id
?如果是这样的话,尽管
obj.Id.GetHashCode()
会更简单一些,但您还是很好的。我的观点是,
GetHashCode
Equals
必须满足某些不变量,作为
IEqualityComparer
合同的一部分。特别是,
GetHashCode(x)!=GetHashCode(y)
表示
等于(x,y)
为false。LINQ
Distinct
方法要求两者都正确实现。如果您感兴趣,Eric Lippert有一份详尽的指南列表: