一尘不染

与lambda不同()?

c#

是的,所以我有一个不可估量的并希望从中获得独特的价值。

使用System.Linq,当然有一个扩展方法称为Distinct。在简单的情况下,可以不使用任何参数,例如:

var distinctValues = myStringList.Distinct();

很好,但是如果我有一个需要枚举的对象枚举,则唯一可用的重载是:

var distinctValues = myCustomerList.Distinct(someEqualityComparer);

相等比较器参数必须是的实例IEqualityComparer<T>。我当然可以做到这一点,但这有点冗长,而且很笨拙。

我本来希望是一个过载,它需要一个lambda,例如Func

var distinctValues
    = myCustomerList.Distinct((c1, c2) => c1.CustomerId == c2.CustomerId);

任何人都知道是否存在这样的扩展名或等效的解决方法?还是我错过了什么?

另外,有没有一种方法可以指定IEqualityComparer内联(不好意思)?

更新资料

我找到了Anders
Hejlsberg对MSDN论坛中有关此主题的帖子的回复。他说:

您将遇到的问题是,当两个对象比较相等时,它们必须具有相同的GetHashCode返回值(否则Distinct内部使用的哈希表将无法正常运行)。我们使用IEqualityComparer,因为它会将Equals和GetHashCode的兼容实现打包到单个接口中。

我想这是有道理的。


阅读 246

收藏
2020-05-19

共1个答案

一尘不染

IEnumerable<Customer> filteredList = originalList
  .GroupBy(customer => customer.CustomerId)
  .Select(group => group.First());
2020-05-19