首頁 > 後端開發 > C++ > 如何確保 LINQ 的 Distinct 方法與自訂物件正確的物件相等?

如何確保 LINQ 的 Distinct 方法與自訂物件正確的物件相等?

Linda Hamilton
發布: 2025-01-20 19:41:14
原創
504 人瀏覽過

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確定相等性。下面的實作檢查兩個欄位中的匹配值以確定相等性:

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);
    }
}
登入後複製

用法:

應用此自訂實作解決了Distinct的問題。修改後的程式碼正確地識別了重複的Author對象,並從結果中刪除了其中一個:

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();
    }
}
登入後複製

結論:

實作IEquatable並重寫Equals方法允許在LINQ操作中自訂物件相等性的定義。這確保了Distinct方法根據其屬性而不是引用地址正確處理自訂物件。

請注意,程式碼範例中已對GetHashCode方法進行了改進,以確保與Equals方法的一致性,並使用了null-conditional operator (?.) 來處理可能為null的屬性。 這避免了潛在的NullReferenceException異常。

以上是如何確保 LINQ 的 Distinct 方法與自訂物件正確的物件相等?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板