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 값을 가지게 된다

그러나 EqualsGetHashCodeIEqualityComparator 안에 구현하게 되면 :

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 과의 차이점은, 이전 예제에서는 EqualsGetHashCode 가 객체 내부에 재정의 되었고, 이 예제에서는 비교 코드를 객체 외부에 따로 정의하였다는 점입니다.

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts