IEquatable을 사용하여 LINQ Distinct에서 개체 동등성 처리
LINQ의 Distinct
방법은 동일성을 기준으로 고유한 개체를 식별하도록 설계되었습니다. 그러나 사용자 정의 개체를 사용하면 항상 예상대로 작동하지 않을 수 있습니다.
제공된 예에서 Distinct
메소드는 동일한 이름을 가진 두 개의 Author
객체를 중복으로 식별하지 못했습니다. 이는 LINQ가 속성 값이 아닌 참조 주소를 기준으로 개체를 고유한 개체로 처리하기 때문입니다.
이 문제를 해결하기 위해 Author
클래스에 IEquatable
인터페이스를 구현할 수 있습니다. Equals
메서드를 재정의하면 속성 값 FirstName
및 LastName
을 기준으로 동등성을 결정하는 사용자 지정 논리를 정의할 수 있습니다. 다음 구현은 두 필드의 일치하는 값을 확인하여 동일한지 확인합니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!