Section 6.4: IEqualityComparer 에서의 Equals 와 GetHashCode
아래와 같이 주어진 Person 타입이 있다고 가정할 때:
public class Person {
public string Name {
get;
set;
}
public int Age {
get;
set;
}
public string Clothes {
get;
set;
}
}
List < Person > persons = new List < Person > {
new Person {
Name = "Jon",
Age = 20,
Clothes = "some clothes"
},
new Person {
Name = "Dave",
Age = 20,
Clothes = "some other clothes"
},
new Person {
Name = "Jon",
Age = 20,
Clothes = ""
}
};
var distinctPersons = persons.Distinct().ToList();// distinctPersons 는 Count = 3 값을 가지게 된다
그러나 Equals
와 GetHashCode
를 IEqualityComparator
안에 구현하게 되면 :
public class PersonComparator: IEqualityComparer < Person > {
public bool Equals(Person x, Person y) {
return x.Name == y.Name && x.Age == y.Age; // 같은 사람인지 비교에 있어 옷은 중요하지 않다
}
public int GetHashCode(Person obj) {
return obj.Name.GetHashCode() * obj.Age;
}
}
var distinctPersons = persons.Distinct(new PersonComparator()).ToList(); // distinctPersons 는 Count = 2 값을 가지게 된다
후자 query 에 대해서는, 두 사람 객체에 대하여 Equals
가 true 를 반환하고 GetHashCode
가 동일한 해시코드를 반환하는 경우에 같다고 간주되고 있음에 유의한다.
역주: 섹션 6.3 과의 차이점은, 이전 예제에서는
Equals
및GetHashCode
가 객체 내부에 재정의 되었고, 이 예제에서는 비교 코드를 객체 외부에 따로 정의하였다는 점입니다.
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.
[출처] https://books.goalkicker.com/CSharpBook/
반응형
'번역 > C# Notes for Professionals' 카테고리의 다른 글
7.2: Null fall-through 와 chaining (0) | 2020.12.02 |
---|---|
7.1: Null 병합 (coalescing) 연산자의 기본 사용법 (0) | 2020.12.01 |
6.3: 사용자 정의 타입에 대해 Equals 와 GetHashCode 재정의하기 (0) | 2020.11.25 |
6.2: Equals 의 기본 동작 (0) | 2020.11.23 |
6.1: 바람직한 GetHashCode 재정의하기 (0) | 2020.11.20 |