使用Lambda表达式定制Distinct()方法
处理可枚举对象时,经常需要区分唯一值。虽然System.Linq命名空间提供了一个Distinct()扩展方法,但它缺少一个接受Lambda表达式来指定对象相等性的重载。
难题
由于缺少基于Lambda表达式的重载,程序员只能使用IEqualityComparer接口,该接口需要实现Equals()和GetHashCode()方法。这种方法可能很繁琐且笨重。
基于Lambda表达式的变通方法
虽然没有现有的扩展方法与所需的Lambda语法匹配,但一种创造性的变通方法可以达到类似的效果。使用GroupBy()和Select(),您可以转换可枚举对象:
<code class="language-csharp">IEnumerable<customer> filteredList = originalList .GroupBy(customer => customer.CustomerId) .Select(group => group.First());</code>
通过按指定的键对元素进行分组,并从每个组中选择第一个元素,您可以有效地根据GroupBy()中提供的Lambda表达式创建一个唯一列表。
基于Lambda表达式的相等性问题
需要注意的是,基于Lambda表达式的相等性比较器可能会导致某些类型(如字符串)出现意外行为。为了可靠地进行唯一操作,必须确保准确且一致的GetHashCode()实现。
更多见解
.NET首席架构师Anders Hejlsberg讨论了基于Lambda表达式的Distinct()重载的局限性,这是因为Distinct()内部的哈希表正常工作需要Equals()和GetHashCode()之间的兼容性。
以上是如何在 C# 中使用 Lambda 表达式高效创建不同列表?的详细内容。更多信息请关注PHP中文网其他相关文章!