사용자 정의 개체에서 LINQ Distinct() 메서드의 비정상적인 동작
LINQ to Objects를 사용할 때 Distinct()
메서드는 사용자 정의 개체로 작업할 때 항상 예상한 결과를 생성하지 않을 수 있습니다. 기본적으로 LINQ는 고유성 비교를 위한 참조만 고려합니다.
제공된 코드 예제에는 Book
개체 목록이 있으며 각 개체에는 Author
개체 목록이 포함되어 있습니다. SelectMany()
을 사용하여 Authors
컬렉션을 단일 목록으로 평면화한 다음 Distinct()
를 호출하면 고유한 작성자만 반환될 것으로 예상합니다. 그러나 동일한 저자(Jon Skeet)가 두 번 나타나는 것을 관찰했습니다.
문제는 LINQ의 Distinct()
메서드가 기본적으로 개체 참조에서 작동한다는 것입니다. 목록에 두 개의 개별 Author
개체가 있으므로 LINQ는 해당 개체의 값이 동일하더라도 서로 다른 개체로 간주합니다. 이 문제를 극복하려면 개체의 고유성을 비교하는 방법을 명확하게 정의하는 사용자 지정 같음 구현을 제공해야 합니다.
Equals 메서드 재정의
질문에서 제안한 대로 Author
클래스의 Equals()
메서드를 재정의하여 동등 조건을 지정할 수 있습니다. 그러나 현재 구현에서는 항상 true
을 반환하므로 모든 작성자가 동일한 것처럼 보입니다.
IEquatable 인터페이스 구현
더 적절한 접근 방식은 클래스에 IEquatable<Author>
인터페이스를 구현하는 것입니다. 이 인터페이스를 사용하면 사용자 정의 동등 비교기를 정의할 수 있습니다. 귀하의 경우에는 작성자 이름을 기준으로 비교할 수 있습니다:
<code class="language-csharp">public class Author : IEquatable<Author> { public bool Equals(Author other) { return FirstName == other.FirstName && LastName == other.LastName; } }</code>
LINQ 쿼리에서 작성자 재사용
IEquatable<Author>
을 구현한 후 이를 사용하여 Distinct()
메서드의 동작을 개선할 수 있습니다. LINQ 쿼리를 다음과 같이 수정합니다.
<code class="language-csharp">var temp = books.SelectMany(book => book.Authors).DistinctBy(a => new { a.FirstName, a.LastName });</code>
DistinctBy()
및 사용자 정의 람다 표현식을 사용하여 FirstName
및 LastName
튜플을 정의하면 작성자의 고유성을 비교하는 방법을 명시적으로 지정할 수 있습니다.
이러한 단계를 수행하면 Distinct()
메소드가 해당 값을 유지하면서 중복 작성자를 올바르게 식별하고 제거하는지 확인할 수 있습니다.
위 내용은 LINQ Distinct()가 사용자 지정 개체에서 예상대로 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!