为什么LINQ不包含`distinct`关键字?

Jef*_*tes 17 c# linq distinct keyword

注意:在您阅读或提供答案之前,我知道Enumerable.Distinct,我问的是该方法的特定语言支持,而不是方法本身.

我一直想知道为什么distinctC#LINQ关键字集中没有关键字,所以我可以写:

var items = distinct from x in y
            select x;
Run Code Online (Sandbox Code Playgroud)

要么

var items = from x in y
            select distinct x;
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么不包括它或为什么包含它是一个坏主意?对我来说,我只需要将查询包装到调用中Distinct(),这感觉很麻烦; 一个distinct关键字会感觉更自然.

注意:我知道Distinct如果需要,该方法会覆盖提供比较器,但使用默认比较器的关键字会很棒.我甚至可以想象一个distinct by关键字组合,以便可以为查询内联提供比较运算符.

Dar*_*rio 14

在VB中,确实存在.

Dim l = From x In {1, 2, 3, 2, 4, 2} Distinct Select x
Run Code Online (Sandbox Code Playgroud)

我不怀疑distinctC#已经有了一些积极的决定,它还没有得到实施.

  • VB还支持查询格式的`Take`和`Skip`. (2认同)

Don*_*nut 10

Charlie Calvert有一篇博客文章("使用Distinct and Avoiding Lambdas")讨论这个问题.从帖子的顶部:

  1. 大多数查询运算符,例如Select(),Where()并将GroupBy()称为lambda的东西作为参数.
  2. Lambdas很难写.
  3. 查询表达式的创建在很大程度上允许开发人员使用LINQ而无需学习与lambdas相关的复杂语法.
  4. 一些查询运算符(例如Distinct(),不)将lambdas作为参数.结果,他们很容易打电话.
  5. 因此,不为诸如Distinct()不使用lambdas的运算符创建查询表达式.

而且,从帖子的更下方:

查询运算符是方法调用.换句话说,也有叫LINQ API的方法Select(),Group(),Distinct()等我们,因为他们把lambda表达式作为参数通常不直接调用这些方法,很多人发现,lambda表达式是很难理解的.为了帮助开发人员避免编写lambda的复杂任务,该团队发明了查询表达式,这是一种位于lambdas之上的"语法糖".

TL; DR:distinct为了简单起见,没有关键字,因为distinct不采用lambda表达式.

  • "我们通常不会直接调用这些方法,因为他们将lambdas作为参数,许多不值得他们的盐的**糟糕的程序员**发现lambdas很难理解" - FTFY. (6认同)
  • "Lambdas很难写." 我第一次阅读那篇文章时,这一点让我很难......然后关闭标签. (3认同)
  • 很好的回答,谢谢.这一切听起来都不错,但它不适合人们如何使用这些东西.这将非常有用,并使事情更容易阅读.我不认为Charlie Calvert提出的论点真的那么强 - 特别是因为关键字WAS包含在VB中. (2认同)
  • 完全同意你们两个.Lambdas并不那么困难,我之前被这个绊倒了 - "等等,所以有一个`Distinct()`方法但是没有`distinct`关键字?" 对我来说没什么意义. (2认同)

Jam*_*ing 5

Reword: distinct是一个set运算符... set运算符不接受lambdas作为参数.c#团队决定为你提供一些方法,这些方法可以使用lambdas,例如Select()Group(),因为他们觉得lambdas可能会让刚开始的人感到困惑. .Distinct()不接受lambda,所以当你直接调用它时就很清楚了.

关于这个主题的一个很好的阅读:http:
//blogs.msdn.com/b/charlie/archive/2006/11/19/linq-farm-group-and-distinct.aspx