> 백엔드 개발 > C++ > LINQ Distinct()가 사용자 지정 개체에서 예상대로 작동하지 않는 이유는 무엇입니까?

LINQ Distinct()가 사용자 지정 개체에서 예상대로 작동하지 않는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2025-01-20 19:28:10
원래의
766명이 탐색했습니다.

Why Doesn't LINQ Distinct() Work as Expected with Custom Objects?

사용자 정의 개체에서 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() 및 사용자 정의 람다 표현식을 사용하여 FirstNameLastName 튜플을 정의하면 작성자의 고유성을 비교하는 방법을 명시적으로 지정할 수 있습니다.

이러한 단계를 수행하면 Distinct() 메소드가 해당 값을 유지하면서 중복 작성자를 올바르게 식별하고 제거하는지 확인할 수 있습니다.

위 내용은 LINQ Distinct()가 사용자 지정 개체에서 예상대로 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿