> 백엔드 개발 > C++ > 사용자 지정 개체를 사용하여 LINQ의 Distinct 메서드에 대한 올바른 개체 동일성을 보장하는 방법은 무엇입니까?

사용자 지정 개체를 사용하여 LINQ의 Distinct 메서드에 대한 올바른 개체 동일성을 보장하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-20 19:41:14
원래의
435명이 탐색했습니다.

How to Ensure Correct Object Equality for LINQ's Distinct Method with Custom Objects?

IEquatable을 사용하여 LINQ Distinct에서 개체 동등성 처리

LINQ의 Distinct 방법은 동일성을 기준으로 고유한 개체를 식별하도록 설계되었습니다. 그러나 사용자 정의 개체를 사용하면 항상 예상대로 작동하지 않을 수 있습니다.

제공된 예에서 Distinct 메소드는 동일한 이름을 가진 두 개의 Author 객체를 중복으로 식별하지 못했습니다. 이는 LINQ가 속성 값이 아닌 참조 주소를 기준으로 개체를 고유한 개체로 처리하기 때문입니다.

이 문제를 해결하기 위해 Author 클래스에 IEquatable 인터페이스를 구현할 수 있습니다. Equals 메서드를 재정의하면 속성 값 FirstNameLastName을 기준으로 동등성을 결정하는 사용자 지정 논리를 정의할 수 있습니다. 다음 구현은 두 필드의 일치하는 값을 확인하여 동일한지 확인합니다.

<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 (FirstName == other?.FirstName && LastName == other?.LastName)
            return true;

        return false;
    }

    // 为保持一致性而重写GetHashCode
    public override int GetHashCode()
    {
        return (FirstName?.GetHashCode() ?? 0) ^ (LastName?.GetHashCode() ?? 0);
    }
}</code>
로그인 후 복사

사용법:

이 사용자 정의 구현을 적용하면 Distinct의 문제가 해결됩니다. 수정된 코드는 중복된 Author 개체를 올바르게 식별하고 결과에서 그 중 하나를 제거합니다.

<code class="language-csharp">using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        // 使用重复作者初始化书籍列表
        List<Book> books = new List<Book>
        {
            new Book
            {
                Name = "C# in Depth",
                Authors = new List<Author>
                {
                    new Author { FirstName = "Jon", LastName = "Skeet" },
                    new Author { FirstName = "Jon", LastName = "Skeet" },
                }
            },
            // ...
        };

        // 选择作者,应用Distinct,并打印
        var temp = books.SelectMany(book => book.Authors).Distinct();
        foreach (var author in temp)
        {
            Console.WriteLine($"{author.FirstName} {author.LastName}");
        }

        Console.Read();
    }
}</code>
로그인 후 복사

결론:

IEquatable을 구현하고 Equals 메서드를 재정의하면 LINQ 작업에서 개체 동등성의 정의를 사용자 지정할 수 있습니다. 이렇게 하면 Distinct 메서드가 참조 주소가 아닌 속성을 기반으로 사용자 정의 개체를 올바르게 처리할 수 있습니다.

코드 예제에서 GetHashCode 메서드는 Equals 메서드와의 일관성을 보장하도록 개선되었으며 null 조건부 연산자(?.)를 사용하여 잠재적인 null 속성을 처리합니다. 이렇게 하면 잠재적인 NullReferenceException 예외가 방지됩니다.

위 내용은 사용자 지정 개체를 사용하여 LINQ의 Distinct 메서드에 대한 올바른 개체 동일성을 보장하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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