Section 6.3: 사용자 정의 타입에 대해 Equals 와 GetHashCode 재정의하기

다음과 같은 Person 클래스가 있다고 할 때:

public class Person {} public string Name { get; set; } public int Age { get; set; } public string Clothes { get; set; } var person1 = new Person { Name = "Jon", Age = 20, Clothes = "some clothes" }; var person2 = new Person { Name = "Jon", Age = 20, Clothes = "some other clothes" }; bool result = person1.Equals(person2); // reference 타입의 Equals 이기 때문에 false 를 반환한다

EqualsGetHashCode 를 다음과 같이 정의할 수 있다:

public class Person { public string Name { get; set; } public int Age { get; set; } public string Clothes { get; set; } public override bool Equals(object obj) { var person = obj as Person; if (person == null) return false; return Name == person.Name && Age == person.Age; // 같은 사람인지 비교에 있어 옷은 중요하지 않다 } public override int GetHashCode() { return Name.GetHashCode() * Age; } } var person1 = new Person { Name = "Jon", Age = 20, Clothes = "some clothes" }; var person2 = new Person { Name = "Jon", Age = 20, Clothes = "some other clothes" }; bool result = person1.Equals(person2); // result 는 true 가 된다

또한 LINQ 를 사용하여 persons 에 대한 다른 query 를 만드는 경우 Equals 와 GetHashCode 가 모두 사용된다:

var 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 = 2 의 값을 가지게 된다
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

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

반응형

+ Recent posts