2013-04-24 3 views
0

ID ID 필드가있는 SQL Server 데이터베이스의 POCO가 있습니다.POCO ID 필드에 IEquatable

public bool Equals(MyClass other) 
    { 
     return this.ID == other.ID; 
    } 

    public override int GetHashCode() 
    { 
     return this.ID; 
    } 
: 나는 그들이 동일한 레코드이라면 내가 확인할 수 있습니다 IEquatable을 구현하고자 내가 저장되지 않은 경우를 비교해야하지 않습니다 가정 List<T>

.Contains()을 사용, 그것은 충분한 단지 사용하여 구현입니다

나는 이것을하려하지만 GetHashCode와 관련이 있는지 100 % 확신 할 수 없거나 다른 고려 사항 (예 : "저장되지 않은 인스턴스" 하나, 나는 그것을 버릴 수있다.) 나는 잘 모르고있다.

+0

'GetHashCode'가 무엇인지 배우려면 [이 답변] (http://stackoverflow.com/a/16147925/572644)을 참조하십시오. –

답변

4

당신은 당신이 그것에 의존 클래스와 같은 Dictionary<TKey, TValue>이 올바르게 처리 할 수 ​​있도록 (당신이 IEquatable<T>을 구현할 때 당신은 또한해야) Equals()를 오버라이드 (override) 할 때마다 GetHashCode()를 오버라이드 (override) 할 필요가있다. 그것은 귀찮게 누출되는 내부 세부 사항 중 하나입니다. More information.

ID를 비교해도 평등성을 판단 할 수 있는지 여부는 모든 상황에서 동일한 ID를 가진 두 엔티티가 동등한 것으로 간주되어야한다는 것을 절대적으로 확신 할 수있는 경우에만 사용하십시오. 응용 프로그램의 요구 사항 만 대답 할 수있는 질문입니다. 나는 독자적으로 엔티티를 가지고 거의 항상 자신을 몇 번이나 해냈다.

// IEquatable<MyClass> implementation 
public bool Equals(MyClass other) 
{ 
    if (other == null) 
    { 
    return false; 
    } 

    return this.ID == other.ID; 
} 

// Override of default Object.Equals() 
public override bool Equals(object other) 
{ 
    return this.Equals(other as MyClass); 
} 

public override int GetHashCode() 
{ 
    // Call ID.GetHashCode() because ID may not always be int, 
    // and the ID type might have a more useful implementation 
    // of GetHashCode() to offer. 
    return this.ID.GetHashCode(); 
} 

당신은 아마이 경우에 ==!= 사업자를 오버라이드 (override) :

나는 이런 식으로 구현하는 것입니다. 동일한 ID를 가진 두 개의 서로 다른 참조를 구별하려면 항상 Object.ReferenceEquals()을 사용할 수 있습니다.

+0

[Object.GetHashCode]에 대한 Microsoft의 문서 (https://docs.microsoft.com/en-us/dotnet/api/system.object.gethashcode?view=netframework-4.7.1#System_Object_GetHashCode)는 GetHashCode '. 특히 ***가 *** 값을 해시하기 위해 "Examples"섹션이 다음으로 시작됩니다. * "숫자 값에 대해 해시 코드를 계산하는 가장 간단한 방법 중 하나는 범위가 [Int32] (https://docs.microsoft.com/en-us/dotnet/api/system.int32?view=netframework-4.7.1) 유형은 단순히 그 값을 반환하는 것입니다. "* – DavidRR

1

귀하의 비즈니스 규칙에 따라 귀하의 ID가 동일 할 때 귀하의 개체가 서로 같을 경우 귀하가 잘하고있는 것보다!

오브젝트 상태의 해시 코드는 상태가 다른 모든 오브젝트가 다른 해시 코드를 리턴해야한다고 설명합니다. 이 해시 코드는 고유하지는 않지만 가능한 한 다른 해시 코드로 만들 수 있습니다. 문자열 "Hello".GetHashCode()"Goodbye".GetHashCode()의 해시 코드를 확인하십시오.

일부 컬렉션에서는 System.Collections.Generic.Dictionary<K,V>System.Collections.Generic.HashSet<T>과 같은 HashCode가 사용됩니다. 이 해시 코드를 사용하면 해당 사전은이 '고유'해시 코드를 사용하여 매우 빠르게 검색 할 수 있습니다 (거의 O (1) 연산). 엔티티 필드의 해시 코드를 사용하여이 해시 코드를 계산하십시오.

IEquatable<T>.Equals을 구현하는 경우 Equals(object)도 재정의하십시오.