2015-01-07 1 views
0

사용자 지정 컬렉션에서 고유 한 항목 목록을 가져 오려고하지만 내 목록에 중복 된 항목이 계속 표시되므로 비교가 무시되는 것 같습니다. ID와 ID2 값이Linq Distinct가 예상 값을 반환하지 않습니다.

사용자 정의 비교 자 문자열 :

public class UpsellSimpleComparer : IEqualityComparer<UpsellProduct> 
{ 
    public bool Equals(UpsellProduct x, UpsellProduct y) 
    { 
     return x.Id == y.Id && x.Id2 == y.Id2; 
    } 

    public int GetHashCode(UpsellProduct obj) 
    { 
     return obj.GetHashCode(); 
    } 
} 
...

참고 내가 코드를 디버깅하고 난 분명히 내가 비교하고 목록의 값이 동일하다고 볼 수 있습니다

호출 코드 : 대부분의 경우 UpsellProduct

var upsellProducts = (Settings.SelectedSeatingPageGuids.Contains(CurrentItem.ID.ToString())) ? 
           GetAOSUpsellProducts(selectedProductIds) : GetGeneralUpsellProducts(selectedProductIds); 

// we use a special comparer here so that same items are not included 
var comparer = new UpsellSimpleComparer(); 
return upsellProducts.Distinct(comparer); 
+0

'string.Equals()'를 사용하여 문자열 값의 동일성을 확인하십시오. –

+0

@ shree.pat18 왜요? (참고 언어 태그는 Java가 아니라 C#입니다.) –

+0

@AlexeiLevenkov 동의하지만, 그렇게하는 것을 선호합니다. C#에서는'=='에 아무런 문제가 없습니다. –

답변

4

재의 각 인스턴스에 대해 고유 한 값을 반환 GetHashCode의 기본 구현이 ference 유형.

수정하려면 UpsellProduct 또는 비교 자에 올바르게 구현하십시오.

public class UpsellSimpleComparer : IEqualityComparer<UpsellProduct> 
{ 
    public bool Equals(UpsellProduct x, UpsellProduct y) 
    { 
     return x.Id == y.Id && x.Id2 == y.Id2; 
    } 

    // sample, correct GetHashCode is a bit more complex 
    public int GetHashCode(UpsellProduct obj) 
    { 
     return obj.Id.GetHashCode()^obj.Id2.GetHashCode(); 
    } 

} 더 나은 코드가 GetHashCode 체크 Concise way to combine field hashcodes?과 결합 계산하기위한

Is it possible to combine hash codes for private members to generate a new hash code?

+0

이것이 문제였습니다. 왜 'GetHashCode()'의 기본 구현이 같은 유형의 각 인스턴스에 대해 고유합니까? –

+1

@MatthewPigram 기본적으로 동일한 유형의 두 고유 인스턴스가 "같음"이 아니기 때문에 "GetHashCode"가 다른 값을 반환하도록하여 "Equal"의 비헤이비어와 일치시키고 Dictionary가 해시 코드를 신속하게 확인하여 비 동일 객체를 제외시킵니다 (참고 이것이 GetHashCode가 존재하는 유일한 이유이기 때문에 더 유용 할 것입니다. –

+0

그렇다면 동일한 데이터를 가진 인스턴스가 2 개있는 경우 평등을 검사하면 잘못된 결과가 발생합니다. 또는 위의 솔루션과 같은 클래스 멤버를 사용하여 기본 해시 코드가 생성됩니까? –

1

귀하의 GetHashCode()도 두 UpsellProduct 인스턴스가 고려되는 동일한 값을 당신의 Equals() 방법으로 동일 반환하지 않습니다.

같은 논리를 대신 사용하려면 다음과 같이 입력하십시오.

public int GetHashCode(UpsellProduct obj) 
{ 
    return obj.Id.GetHashCode()^obj.Id2.GetHashCode(); 
}