C\#Distinct 와 IEquality Comparer 를 다시 쓸 때 알 아야 할 두 세 가지

우리 가 매 거 진 대상 을 모 아 재 작업 을 하려 고 할 때,일반적으로 가장 먼저 생각 하 는 것 은 바로 Linq 의 Distinct 방법 이다.
먼저 클래스 를 정의 한 다음 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 대상 이 한 명 밖 에 없어 서 무 거 운 것 을 성공 적 으로 실현 했다.
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기