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()
方法現在根據 FirstName
和 LastName
比較作者。 GetHashCode()
方法確保具有相同值的物件的一致雜湊。 現在,Distinct()
將根據姓名正確識別並刪除重複的作者。
結論:為Distinct()
實作 IEquatable<T>
提供了一種關鍵機制來控制如何比較自訂物件是否相等,從而使 Distinct()
在處理基於值的重複項時能夠正確運作。 這可確保 Distinct()
按預期運行,根據您定義的重要屬性刪除重複項。
以上是為什麼 LINQ 的 Distinct 不能與自訂物件一起使用,如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!