이 질문을 너무 많이 반복하지는 않지만 이미 검색을 수행하고 결과가 비어 있습니다. 그래서 저는 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 카운트를 산출했다. 내가 잘못하고있는 것이 있거나 없습니까? 감사. }이이 문제
아니요, 같음 *이 호출되지만 해시 코드로 이미 일치하는 항목 인 경우에만 호출됩니다. 해시 코드를 사용하지 않습니다. –
아, 알았어, 나보고 다시보고하자. 감사. – dangerisgo