注意:在您阅读或提供答案之前,我知道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
关键字组合,以便可以为查询内联提供比较运算符。
答案 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")讨论这个问题。从帖子的顶部开始:
- 大多数查询运算符(例如
Select()
,Where()
和GroupBy()
都会将名为lambda的内容作为参数。- Lambdas很难写。
- 查询表达式的创建在很大程度上允许开发人员使用LINQ而无需学习与lambdas相关的复杂语法。
- 一些查询运算符(例如
Distinct()
)不会将lambdas作为参数。因此,他们很容易打电话。- 因此,没有为不使用lambdas的
醇>Distinct()
等运算符创建查询表达式。
此外,从帖子的下方开始:
查询运算符是方法调用。换句话说,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