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表达式可以直接与`dimption()`在c#中使用吗?的详细内容。更多信息请关注PHP中文网其他相关文章!