对,所以我有一个enumerable,并希望从中获得不同的值。
使用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对这个主题的帖子的回复。他说:
您将遇到的问题是,当两个对象比较时等于它们必须具有相同的GetHashCode返回值(否则在内部使用的哈希表将无法正常工作)。我们使用IEqualityComper,因为它包兼容Equals和GetHashCode在单个接口中的实现。
我想这是有道理的。