Distinct()
方法與 Lambda 表達式:替代方法探索System.Linq 中的 Distinct()
擴充方法提供了一種方便的方法來從可枚舉物件中過濾掉重複元素。雖然在簡單情況下可以不帶參數使用,但它需要一個 IEqualityComparer
實例來決定物件的相等性。這可能很麻煩,尤其是在使用 lambda 表達式時。
Distinct()
是否有接受 lambda 表達式的重載?以下是實作方法:
您可以定義自己的擴充方法,該方法採用 lambda 表達式來比較元素:
<code class="language-csharp">public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> source, Func<T, TKey> keySelector) { return source.GroupBy(keySelector).Select(group => group.First()); }</code>
用法:
<code class="language-csharp">var distinctValues = myCustomerList.DistinctBy(customer => customer.CustomerId);</code>
雖然無法直接內嵌指定 IEqualityComparer
,但可以使用自訂比較器類別作為變通方法:
<code class="language-csharp">public class CustomerEqualityComparer : IEqualityComparer<Customer> { public bool Equals(Customer x, Customer y) { return x.CustomerId == y.CustomerId; } public int GetHashCode(Customer obj) { return obj.CustomerId.GetHashCode(); } }</code>
用法:
<code class="language-csharp">var equalityComparer = new CustomerEqualityComparer(); var distinctValues = myCustomerList.Distinct(equalityComparer);</code>
C# 語言設計者 Anders Hejlsberg 已經解決了這個問題。他解釋說,定義一個接受lambda 表達式的Distinct()
重載在技術上具有挑戰性,因為如果要使物件在內部雜湊表中正常工作,則相等的元素必須具有相同的GetHashCode
傳回值。因此,必須使用 IEqualityComparer
。
以上是Lambda 表達式可以直接與 C# 中的 `Distinct()` 一起使用嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!