VB.Net 和 C# 之间 LINQ 语法的区别

15

再次,只是出于好奇:

在我用VB.Net编写了几个项目之后,我惊讶地发现C#和VB.NET的LINQ用法存在一些不太明显的差异。例如,如果我们想要按多个属性(列)对元素进行分组,我们需要显式地创建一个新的匿名类型:

var procs = from c in Process.GetProcesses() 
            group c by new {c.BasePriority, c.Id} into d 
            select d;

而在VB.NET中,更为简单的语法已经足够了:

Dim b = From c In Process.GetProcesses()
        Group c By c.BasePriority, c.Id Into Group
        Select Group

因此,在这里不需要使用“new”创建类型。

其他有什么区别?是否有一个好的比较C#和VB.NET中LINQ语法的方法?

2个回答

18

我知道一些区别,主要是VB.NET的LINQ拥有一些隐藏的亮点:

  1. 虽然不是显式与LINQ相关的,但VB.NET支持在匿名类型上使用Key修饰符。这允许您定义哪些属性在比较匿名类型时使用。据我所知,C#会使用所有内容。这就是VB.NET实际上具有优势的地方。
  2. VB.NET支持Skip操作作为关键字:Dim returnCustomers = From a In list Skip numToSkip Select a您可以在C#中做到这一点,但必须通过扩展方法,没有语法糖。
  3. VB.NET LINQ也支持Skip WhileFrom a In list Skip While someCondition Select a同样,C#可以做到这一点,但只能通过扩展方法。
  4. 和4.5:与2&3相同,只是使用TakeTake While
  5. Select关键字在VB.NET中是可选的。如果您想选择当前的内容,则可以正常工作:Dim shortWords = From l In list Where l.Length < 10C#需要Select部分:var shortWords = from l in list where l.Length < 10 select l

这些是我知道的VB.NET LINQ的附加“功能”。

例如,对于C#:

var skip10 = (from c in customers select c).Skip(10);

而在 VB.NET 中

Dim skip10 = From c In Customers Skip 10

你可以在这里查看所有的文档:http://msdn.microsoft.com/en-us/library/ksh7h19t(v=VS.90).aspx


1
所以,如果我理解你的意思正确的话,与C#相比,在VB.Net中可以使用类似操作符的语法编写更多的LINQ扩展方法(例如,不需要再写(...).Skip()而只需在LINQ查询中间写上Skip)。这很好,谢谢! - Alexander Galkin
1
@Alaudo - 是的,看起来VB.NET在语言本身中就有更多的内置功能。我还添加了#5,它表明“Select”部分不像C#中那样是强制性的。 - vcsjones
哦,谢谢您添加更多的示例!就C#和LINQ而言,据我所知,您也可以跳过select关键字,例如var d = from c in customers where c.Age > 18。我错了吗? - Alexander Galkin
@Alaudo:不行。这将导致编译器错误:“查询体必须以select子句或group子句结束”。该错误在此处有记录:http://msdn.microsoft.com/en-us/library/bb383932(v=vs.90).aspx - vcsjones
1
还有Aggregate,但是它有自己的问题 - Mark Hurd
据我所知,截至2022年4月,这个答案仍然是正确的。微软(或其他人)是否给出了C#缺少一些VB.NET可用的便捷语法的原因? - Bolpat

2

1
我主要关心的是与LINQ相关的差异,第一个链接很有趣,但非常简短--它只是一个块条目。剩下的两个链接是关于VB.Net和C#之间过时的比较,并且没有包含任何关于LINQ的信息。可惜... - Alexander Galkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接