C# 用于长基元的GetHashCode()
我正在为LINQ distinct表达式编写一个EqualityComparer,但我不太确定GetHashCode重载方法。下面的代码正确吗?Id属性是一个长基元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
public int GetHashCode(Deal obj)
{
return ((int)obj.Id) ^ ((int)(obj.Id >> 32)); ;
}
可能您应该检查
obj
是否为空。如果为空,则返回0
。老实说,long
Id的实现与long
数据类型的.NET FrameworkGetHashCode
完全相同。换句话说,在非空检查后,您只需调用obj.Id.GetHashCode()
。答案取决于您在Equals
方法中比较的内容。为什么不返回obj.Id.GetHashCode()
?我只是在比较Equals方法的==运算符。在我的上下文中,我并不真的需要hashcode,但我只是希望得到关于long原语的澄清,因为在精度上有损失。与==
相比,什么?Id
?如果是这样的话,尽管obj.Id.GetHashCode()
会更简单一些,但您还是很好的。我的观点是,GetHashCode
和Equals
必须满足某些不变量,作为IEqualityComparer
合同的一部分。特别是,GetHashCode(x)!=GetHashCode(y)
表示等于(x,y)
为false。LINQDistinct
方法要求两者都正确实现。如果您感兴趣,Eric Lippert有一份详尽的指南列表: