首頁 > 後端開發 > C++ > 為什麼 LINQ 的 Distinct 對於自訂物件不能如預期般運作?

為什麼 LINQ 的 Distinct 對於自訂物件不能如預期般運作?

Patricia Arquette
發布: 2025-01-20 19:46:13
原創
703 人瀏覽過

Why Doesn't LINQ's Distinct Work as Expected with Custom Objects?

了解 LINQ 對自訂物件的獨特方法限制

LINQ 的 Distinct() 方法在與自訂物件一起使用時可能是不可預測的。 預設行為依賴於物件引用相等性,而不是其屬性的相等性。 這意味著具有相同屬性值的兩個不同物件仍將被 Distinct().

視為唯一

要克服此限制,您需要定義自訂物件如何確定相等性。常見的解決方案是實作 IEquatable<T> 介面。

實作 IEquatable 以實現自訂物件相等

讓我們用一個 Author 類別來說明這一點:

<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 (other == null) return false;
        return FirstName == other.FirstName && LastName == other.LastName;
    }

    public override int GetHashCode()
    {
        unchecked // Overflow is fine, just wrap
        {
            int hash = (FirstName != null ? FirstName.GetHashCode() : 0);
            hash = (hash * 397) ^ (LastName != null ? LastName.GetHashCode() : 0);
            return hash;
        }
    }
}</code>
登入後複製

此實作定義了平等:

  • Equals(Author other): 此方法比較兩個 FirstName 物件的 LastNameAuthor 屬性。 如果兩個屬性相等,則傳回 true,否則回傳 false。 為了穩健性,包含空檢查。

  • GetHashCode(): 此方法根據 FirstNameLastName 屬性產生雜湊程式碼。 一致的雜湊碼對於高效率的 Distinct() 操作至關重要。 unchecked 關鍵字和素數乘法改善了雜湊碼分佈。

透過正確實現 Equals()GetHashCode(),可以確保 Distinct() 將具有相同屬性值的物件視為相等,從而提供預期的結果。

以上是為什麼 LINQ 的 Distinct 對於自訂物件不能如預期般運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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