2012-11-06 4 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

나는 Equals 메서드에 대해 == 연산자와 비교 중이다. 내 컨텍스트에서 해시 코드가 실제로 필요한 것은 아니지만 정밀도가 떨어지기 때문에 긴 프리미티브에 대한 설명을 얻기를 바랬습니다. – 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가 null인지 여부를 확인해야합니다. null의 경우 0을 반환합니다. 솔직히 long ID 구현은 long 데이터 형식의 .NET Framework GetHashCode과 완전히 동일합니다. 다시 말하면 null 검사를 수행하지 않고 obj.Id.GetHashCode()으로 전화하면됩니다.