C\#Distinct 와 IEquality Comparer 를 다시 쓸 때 알 아야 할 두 세 가지
2990 단어 c#distinctiequalitycomparer
먼저 클래스 를 정의 한 다음 Distinct 방법 으로 무 게 를 줄 입 니 다.
class Man
{
public int Age { get; set; }
public string Name { get; set; }
public string Adress { get; set; }
public decimal Weight { get; set; }
public decimal Height { get; set; }
}
List<Man> list = new List<Man>()
{
new Man(){Age=21,Name="Adam",Adress="Shenzhen",Weight=60,Height=170},
new Man(){Age=21,Name="Adam",Adress="Shenzhen",Weight=60,Height=170}
};
var distinct = list.Distinct();
그러나 다시 얻 은 distinct 집합 Count 는 여전히 2 이 고 집합 에는 두 명의 아담 이 존재 한다.실제로 Distinct 방법 에서 비교 한 것 은 대상 속성 이 아 닌 성명 의 인용 이 며,두 속성 이 똑 같은 대상 에 게 Equals()방법 을 사용 해 False 를 얻 은 것 과 같다.
따라서 우 리 는 대상 집합 에 대해 Distinct 방법 을 사용 할 때 무 거 운 짐 을 사용 해 야 한다
Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);
이 방법 을 사용 하려 면 IEquality Comparer 인 터 페 이 스 를 다시 쓰 고 Distinct 방법 을 사용 해 야 합 니 다.
public class ManComparer : IEqualityComparer<Man>
{
public bool Equals(Man x, Man y)
{
return x.Age == y.Age
&& x.Name == y.Name
&& x.Adress == y.Adress
&& x.Weight == y.Weight
&& x.Height == y.Height;
}
public int GetHashCode(Man obj)
{
return obj.GetHashCode();
}
}
var distinct = list.Distinct(new ManComparer());
그러나 다시 한 번,distinct 집합 에는 여전히 두 개의 대상 이 있다.실제로 대상 의 HashCode 를 직접 가 져 오기 때문에 HashCode 로 비교 하 는 속도 가 Equals 방법 보다 빠 릅 니 다.
따라서 IEquality Comparer 내부 에 서 는 Equals 를 사용 하기 전에 GetHashCode 방법 을 먼저 사용 하고,두 대상 의 HashCode 가 동일 할 때 즉시 대상 을 동일 하 게 판단 한다.
두 대상 의 HashCode 가 같 지 않 으 면 Equals 방법 이 호출 되 어 비교 할 대상 을 판단 한다.
상례 에서 list 의 두 인용 은 사실상 두 개의 서로 다른 대상 이기 때문에 HashCode 는 반드시 같 지 않다
그래서 Equlas 방법 을 실행 하려 면 GetHashCode 를 바 꾸 어 같은 상수 로 되 돌려 주어 야 합 니 다.
public class ManComparerNew : IEqualityComparer<Man>
{
public bool Equals(Man x, Man y)
{
return x.Age == y.Age
&& x.Name == y.Name
&& x.Adress == y.Adress
&& x.Weight == y.Weight
&& x.Height == y.Height;
}
public int GetHashCode(Man obj)
{
return 1;
}
}
var distinct = list.Distinct(new ManComparerNew());
이제 distinct 집합 에는 Man 대상 이 한 명 밖 에 없어 서 무 거 운 것 을 성공 적 으로 실현 했다.총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.