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

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

Jan 20, 2025 pm 07:41 PM

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

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
兩個點博物館:所有展覽以及在哪裡可以找到它們
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
兩個點博物館:所有展覽以及在哪裡可以找到它們
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

c語言函數格式字母大小寫轉換步驟 c語言函數格式字母大小寫轉換步驟 Mar 03, 2025 pm 05:53 PM

c語言函數格式字母大小寫轉換步驟

Gulc:從頭開始建造的C庫 Gulc:從頭開始建造的C庫 Mar 03, 2025 pm 05:46 PM

Gulc:從頭開始建造的C庫

c語言函數返回值的類型有哪些?返回值是由什麼決定的? c語言函數返回值的類型有哪些?返回值是由什麼決定的? Mar 03, 2025 pm 05:52 PM

c語言函數返回值的類型有哪些?返回值是由什麼決定的?

C標準模板庫(STL)如何工作? C標準模板庫(STL)如何工作? Mar 12, 2025 pm 04:50 PM

C標準模板庫(STL)如何工作?

c語言函數的定義和調用規則是什麼 c語言函數的定義和調用規則是什麼 Mar 03, 2025 pm 05:53 PM

c語言函數的定義和調用規則是什麼

c語言函數返回值在內存保存在哪裡? c語言函數返回值在內存保存在哪裡? Mar 03, 2025 pm 05:51 PM

c語言函數返回值在內存保存在哪裡?

distinct用法和短語分享 distinct用法和短語分享 Mar 03, 2025 pm 05:51 PM

distinct用法和短語分享

如何有效地使用STL(排序,查找,轉換等)的算法? 如何有效地使用STL(排序,查找,轉換等)的算法? Mar 12, 2025 pm 04:52 PM

如何有效地使用STL(排序,查找,轉換等)的算法?

See all articles