DistinctBy
기능 을 얻기 위해 MoreLinq 라이브러리를 프로젝트에 추가하지 않으려 Distinct
는 경우 IEqualityComparer
인수 를 취하는 Linq의 메소드 과부하를 사용하여 동일한 최종 결과를 얻을 수 있습니다 .
람다 구문을 사용하여 일반 클래스의 두 인스턴스에 대한 사용자 정의 비교를 수행하는 일반 사용자 정의 평등 비교 자 클래스를 작성하여 시작하십시오.
public class CustomEqualityComparer<T> : IEqualityComparer<T>
{
Func<T, T, bool> _comparison;
Func<T, int> _hashCodeFactory;
public CustomEqualityComparer(Func<T, T, bool> comparison, Func<T, int> hashCodeFactory)
{
_comparison = comparison;
_hashCodeFactory = hashCodeFactory;
}
public bool Equals(T x, T y)
{
return _comparison(x, y);
}
public int GetHashCode(T obj)
{
return _hashCodeFactory(obj);
}
}
그런 다음 기본 코드에서 다음과 같이 사용합니다.
Func<Person, Person, bool> areEqual = (p1, p2) => int.Equals(p1.Id, p2.Id);
Func<Person, int> getHashCode = (p) => p.Id.GetHashCode();
var query = people.Distinct(new CustomEqualityComparer<Person>(areEqual, getHashCode));
짜잔! :)
위의 내용은 다음과 같습니다.
- 부동산
Person.Id
유형int
people
컬렉션에 null 요소가 포함되어 있지 않습니다
컬렉션에 null이 포함되어 있으면 람다를 다시 작성하여 null을 확인하십시오.
Func<Person, Person, bool> areEqual = (p1, p2) =>
{
return (p1 != null && p2 != null) ? int.Equals(p1.Id, p2.Id) : false;
};
편집하다
이 접근법은 Vladimir Nesterovsky의 답변과 비슷하지만 더 간단합니다.
Joel의 답변과 비슷하지만 여러 속성을 포함하는 복잡한 비교 논리를 허용합니다.
당신의 목적은 오직 다를 수 있습니다 경우에는 Id
다음 다른 사용자가 당신이해야 할 모든 기본 구현을 오버라이드 (override)이라는 정답 준 GetHashCode()
과 Equals()
당신의 Person
클래스를 한 후 바로 아웃 - 오브 - 박스 사용하는 Distinct()
필터의 LINQ 방법을 모든 중복.