1

이 질문을 너무 많이 반복하지는 않지만 이미 검색을 수행하고 결과가 비어 있습니다. 그래서 저는 T 타입의 EntityCollection을 두 개 가지고 있습니다. 각각의 공통 항목을 찾고 싶습니다. 캐치? 하나를 제외한 모든 필드가 일치해야합니다. 예를 들어, 유형 T가 CustomSet 유형이고 CustomSet에 필드 F1, F2, F3이 있고 OtherId, F1, F2 및 F3 필드가 일치해야합니다 (문자열, 정수일 수 있음) 그리고 OtherId는 절대로 일치하지 않습니다. 시합. 내 현재의 구현 : 그 OtherId 열은 필드 F1, F2 및 F3가 일치하더라도, 다른 컬렉션과 일치하지 않습니다 때문에사용자 정의 IEqualityComparer를 통해 2 개의 EntityCollections와 교차

var intersections = source.Intersect(destination).ToList(); 

이 어떤 결과를 얻을하지 않습니다. 그래서 다음과 같습니다 IEqualityComparer의 사용자 지정 구현을 제안 해요 : 이제

var intersections = source.Intersect(destination, new EntityCollectionComparer<T>()).ToList(); 

public class EntityCollectionComparer<T> : IEqualityComparer<T> 
{ 
    #region IEqualityComparer<T> Members 

    public bool Equals(T x, T y) 
    { 
     if (x.Equals(y)) 
      return true; 
     else 
      return false; 
    } 

    public int GetHashCode(T obj) 
    { 
     if (obj is CustomSet) 
     { 
      CustomSet temp = obj as CustomSet; 

      return (temp.F1.GetHashCode()^temp.F2.GetHashCode()^temp.F3.GetHashCode()); 
     } 
     return obj.GetHashCode(); 
    } 

를, 나는 단지 형 CustomSet이다이이 때문에 obj가 통과하기 테스트 해요, 난에 대한 진술 경우 필요한 추가됩니다 내 이 기능이 제대로 작동하려면 다른 유형을 사용해야합니다. Intersect 확장은 Equals 대신 GetHashCode를 사용하여 항목을 비교합니다.이 클래스는 EntityCollections의 Intersect 확장에 대해 호출되지 않을 것이므로이 클래스가 내 동등한 것에 신경 쓰지 않는 이유는 항목을 비교하는 것입니다. 문제는 이것이 작동하지 않는다는 것입니다. 내 테스트 세트에서, 나는 내 '소스'컬렉션에 28 개의 항목이 있고, '목적지'컬렉션에 28 개의 항목이 있고 모든 필드가 일치한다는 것을 알고있다. (분명히 OtherId 필드 제외). 나는 GetHashCode 코드를 밟아서 56 회 반복했고 각 세트의 모든 28 개 항목에 대해 해시 코드를 일치시킬 수 있었지만 'intersections'는 0 카운트를 산출했다. 내가 잘못하고있는 것이 있거나 없습니까? 감사. }이이 문제

+0

아니요, 같음 *이 호출되지만 해시 코드로 이미 일치하는 항목 인 경우에만 호출됩니다. 해시 코드를 사용하지 않습니다. –

+0

아, 알았어, 나보고 다시보고하자. 감사. – dangerisgo

답변

1

입니다 :

내가 교차 확장이 정말 무엇을이 클래스로 내 등호에있어 상관하지 않는 이유입니다 항목을 비교하는 같음 대신 GetHashCode는를 사용하는 것을 알 것 EntityCollections의 Intersect 확장에 대해서는 호출되지 않습니다.

그건 사실이 아닙니다. GetHashCode은 값을 버킷팅하는 최초의 "빠른"방법으로 사용되지만 동일한 해시가있는 항목에 대해서는 Equals이 계속 호출됩니다. 그렇지 않으면 이들이 동일하다는 것을 알 수 없습니다.

해시 테이블 등이 항상 작동하는 방식입니다. 성능상의 이유로 부동 한 값이 다를 수 있지만 이 충돌 할 수 있도록 해시가 서로 달라야합니다.

+0

감사합니다! 그거야. – dangerisgo