了解 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
物件的 LastName
和 Author
屬性。 如果兩個屬性相等,則傳回 true
,否則回傳 false
。 為了穩健性,包含空檢查。
GetHashCode()
: 此方法根據 FirstName
和 LastName
屬性產生雜湊程式碼。 一致的雜湊碼對於高效率的 Distinct()
操作至關重要。 unchecked
關鍵字和素數乘法改善了雜湊碼分佈。
透過正確實現 Equals()
和 GetHashCode()
,可以確保 Distinct()
將具有相同屬性值的物件視為相等,從而提供預期的結果。
以上是為什麼 LINQ 的 Distinct 對於自訂物件不能如預期般運作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!