首頁 > 後端開發 > C++ > 為什麼 LINQ 的 Distinct 不能與自訂物件一起使用,如何修復它?

為什麼 LINQ 的 Distinct 不能與自訂物件一起使用,如何修復它?

Susan Sarandon
發布: 2025-01-20 19:37:11
原創
688 人瀏覽過

Why Doesn't LINQ's Distinct Work with Custom Objects, and How Can I Fix It?

LINQ 的 Distinct() 和自訂物件:常見陷阱

LINQ 的 Distinct() 方法簡化了從集合中刪除重複項的過程。 然而,它對於自訂物件的行為卻出乎意料,通常無法根據其屬性識別重複項。

問題:引用與值相等

問題在於Distinct()如何比較物件。它使用引用相等,這意味著兩個物件被認為是不同的,除非它們佔用相同的記憶體位置。 這意味著即使兩個自訂物件具有相同的屬性值,Distinct() 也會將它們視為單獨的實體。

說明範例:重複作者

想像一個書籍列表,每本書都有一個作者列表。 即使兩本書列出了相同的作者(相同的名字和姓氏),Distinct() 也不會刪除重複的作者條目,因為它們是不同的物件實例。

解:實作IEquatable<T>

要解決此問題,請在自訂物件類別中實作 IEquatable<T> 介面(例如 Author)。此介面強制使用 Equals()GetHashCode() 方法,可讓您定義如何確定物件的相等性。 透過重寫這些方法,您可以指示 Distinct() 根據屬性值而不是參考進行比較。

增強Author課程

這是一個改良的 Author 類,實作 IEquatable<Author>:

public class Author : IEquatable<Author>
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public bool Equals(Author other)
    {
        if (other == null) return false;
        return FirstName == other.FirstName && LastName == other.LastName;
    }

    public override int GetHashCode()
    {
        return (FirstName?.GetHashCode() ?? 0) ^ (LastName?.GetHashCode() ?? 0);
    }
}
登入後複製

解:基於價值的比較

透過實作 IEquatable<Author>Equals() 方法現在根據 FirstNameLastName 比較作者。 GetHashCode() 方法確保具有相同值的物件的一致雜湊。 現在,Distinct() 將根據姓名正確識別並刪除重複的作者。

結論:為Distinct()

客製化平等

實作 IEquatable<T> 提供了一種關鍵機制來控制如何比較自訂物件是否相等,從而使 Distinct() 在處理基於值的重複項時能夠正確運作。 這可確保 Distinct() 按預期運行,根據您定義的重要屬性刪除重複項。

以上是為什麼 LINQ 的 Distinct 不能與自訂物件一起使用,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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