【问题标题】:Select distinct without creating IEqualityComparer选择 distinct 而不创建 IEqualityComparer
【发布时间】:2012-11-12 18:30:38
【问题描述】:

我想使用 Linq 从集合中选择一组不同的元素而不创建 IEqualityComparer 类。我不知道如何创建一个 lambda 表达式,该表达式被评估为 IEqualityComparer 以与Distinct() 一起使用。因此,我使用分组来选择具有不同名称的客户:

var distinctCustomers = new List<Customer>();
var groups= customers.GroupBy (cust => cust.Name);
foreach (var g in groups)
{
  foreach (var customer in g)
  {
    distinctCustomers.Add (customer);
    break;
  }
}

但这似乎很恶心。

我想将Distinct 与 lambda 表达式一起使用

var distinctCustomers = customers.Distinct ( <lambda here ?> )

或者比上面列出的更简洁的 Linq 表达式。

有什么想法吗?

【问题讨论】:

  • 你的意思是你想区分某个值
  • 您正在寻找 DistinctBy - 不包含在 BCL 中,但各种实现都是现成的
  • 我建议实现 MoreLinq dll,因为它已经内置了不同的功能 code.google.com/p/morelinq

标签: c# linq


【解决方案1】:

如果您不想重新实现DistinctBy(或使用类似the one in MoreLINQ),您可以通过GroupBySelect 执行此操作,您只需选择每个组中的第一个元素:

var distinctCustomers = customers.GroupBy(cust => cust.Name).Select(g => g.First());

【讨论】:

  • 太棒了,这正是我想要的。我也会考虑使用扩展的 Linq 库。
【解决方案2】:

使用 Jon Skeet 的 MoreLINQ,它有一个 DistinctBy 方法。或者将其实现到您的代码中。

IEnumerable<Customer> distinctCustomers = customers.DistinctBy(c => c.Name);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多