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

时间:2010-11-12 17:13:21

标签: c# linq distinct keyword

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

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

var items = distinct from x in y
            select x;

var items = from x in y
            select distinct x;

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

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

3 个答案:

答案 0 :(得分:14)

在VB中,实际上

Dim l = From x In {1, 2, 3, 2, 4, 2} Distinct Select x

我并不怀疑对C#distinct做出了一些积极的决定,但它还没有实现。

答案 1 :(得分:10)

Charlie Calvert有一个blog post ("Using Distinct and Avoiding Lambdas")讨论这个问题。从帖子的顶部开始:

  
      
  1. 大多数查询运算符(例如Select()Where()GroupBy()都会将名为lambda的内容作为参数。
  2.   
  3. Lambdas很难写。
  4.   
  5. 查询表达式的创建在很大程度上允许开发人员使用LINQ而无需学习与lambdas相关的复杂语法。
  6.   
  7. 一些查询运算符(例如Distinct())不会将lambdas作为参数。因此,他们很容易打电话。
  8.   
  9. 因此,没有为不使用lambdas的Distinct()等运算符创建查询表达式。
  10.   

此外,从帖子的下方开始:

  

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

TL; DR:为简单起见,没有distinct个关键字,因为distinct不接受lambda表达式。

答案 2 :(得分:5)

Reword:distinct是一个集合运算符... 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