好的,所以我有一个可枚举对象,希望从中获取不同的值。
使用System.Linq
,当然有一个名为Distinct
的扩展方法。在简单的情况下,可以像这样不带参数地使用:
var distinctValues = myStringList.Distinct();
很好,但是如果我有一个对象的可枚举集合需要指定相等性,唯一可用的重载是:
var distinctValues = myCustomerList.Distinct(someEqualityComparer);
相等比较器参数必须是 IEqualityComparer<T>
的实例。当然,我可以做到这一点,但有些啰嗦,而且不太优雅。
我期望的是一个重载,它可以使用 lambda 表达式,比如 Func<T, T, bool>
:
var distinctValues = myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);
有人知道是否存在这样的扩展,或者某种等效的解决方法吗?还是我漏掉了什么?
另外,有没有一种内联指定IEqualityComparer
的方法(让我尴尬)?
更新
我在MSDN论坛上找到了Anders Hejlsberg对此主题的post的回复。他说:
你将遇到的问题是,当两个对象相等时,它们必须具有相同的GetHashCode返回值(否则Distinct在内部使用的哈希表将无法正常工作)。我们使用IEqualityComparer,因为它将Equals和GetHashCode的兼容实现打包到单个接口中。
我想这很有道理。
.Distinct(new KeyEqualityComparer<Customer,string>(c1 => c1.CustomerId))
,并解释为什么 GetHashCode() 的正常工作非常重要。 - marbel82