사용자 정의 개체에 대한 LINQ의 고유 메서드 제한 이해
LINQ의 Distinct()
메서드는 사용자 정의 개체와 함께 사용할 때 예측할 수 없습니다. 기본 동작은 해당 속성의 동일성이 아니라 객체 참조 동일성에 의존합니다. 이는 동일한 속성 값을 가진 두 개의 서로 다른 개체가 Distinct()
에 의해 여전히 고유한 것으로 간주된다는 것을 의미합니다.
이러한 제한을 극복하려면 사용자 정의 개체가 동등성을 결정하는 방법을 정의해야 합니다. 일반적인 해결책은 IEquatable<T>
인터페이스
사용자 정의 개체 동일성을 위한 IEquatable 구현
이를 Author
클래스로 설명하겠습니다.
<code class="language-csharp">public class Author : IEquatable<Author> { public string FirstName { get; set; } public string LastName { get; set; } public bool Equals(Author other) { if (other == null) return false; return FirstName == other.FirstName && LastName == other.LastName; } public override int GetHashCode() { unchecked // Overflow is fine, just wrap { int hash = (FirstName != null ? FirstName.GetHashCode() : 0); hash = (hash * 397) ^ (LastName != null ? LastName.GetHashCode() : 0); return hash; } } }</code>
이 구현은 동등성을 정의합니다.
Equals(Author other)
: 이 방법은 두 FirstName
개체의 LastName
및 Author
속성을 비교합니다. 두 속성이 모두 같으면 true
를 반환하고, 그렇지 않으면 false
을 반환합니다. 견고성을 위해 Null 검사가 포함되어 있습니다.
GetHashCode()
: 이 메서드는 FirstName
및 LastName
속성을 기반으로 해시 코드를 생성합니다. 효율적인 Distinct()
작업을 위해서는 일관된 해시 코드가 중요합니다. unchecked
키워드와 소수 곱셈은 해시 코드 분포를 향상시킵니다.
Equals()
및 GetHashCode()
을 올바르게 구현하면 Distinct()
가 동일한 속성 값을 가진 객체를 동일한 것으로 간주하여 예상한 결과를 제공하도록 할 수 있습니다.
위 내용은 LINQ의 Distinct가 사용자 지정 개체에서 예상대로 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!