我不知道上面的标题是否合适。
就像a
和b
:
var list = Enumerable.Range(0, 100);
var a = from l in list
where l % 2 == 0
select l;
var b = list.Where(l => l % 2 == 0);
我应该什么时候使用它们中的每一个?有什么区别吗?
无,查询表达式编译为方法表达式。
因为查询返回一个 IEnumerable,所以您可以通过将方法调用链接在一起来将它们组合成方法语法。这是 编译器在您使用查询语法编写查询时在后台执行的操作
另请参阅:LINQ 查询表达式(C# 编程指南)
在编译时,查询表达式会根据 C# 规范中规定的规则转换为标准查询运算符方法调用。任何可以用查询语法表达的查询,也可以用方法语法表达。但是,在大多数情况下,查询语法更具可读性和简洁性。有关详细信息,请参阅 C# 语言规范和标准查询运算符概述。
除了我发现在查询表达式中无法完成的事情的一个地方是获取索引以及项目。例如,您可以在方法语法中执行以下操作:
var result = list.Select((r,i) => new { value = r, index = i});
在查询表达式中,必须定义一个外部变量来实现此目的。这是一个类似的讨论,来自 Jon Skeet 的回答
它们之间没有区别。
从Query Syntax and Method Syntax in LINQ
因为查询返回一个 IEnumerable,所以您可以通过将方法调用链接在一起来将它们组合成方法语法。这是编译器在您使用查询语法编写查询时在后台执行的操作。并且由于查询变量不存储查询结果,因此您可以随时修改它或将其用作新查询的基础,即使在它已经执行之后也是如此。
在编译时,查询表达式被转换为标准查询运算符方法调用。
查询表达式由编译器转换为标准方法调用。
var a = from l in list
where l % 2 == 0
select l;
var b = list.Where(l => l % 2 == 0);
这两个在编译代码中完全相同。
但是,并非所有方法都在查询表达式语法中具有关联的关键字。
没有区别,看个人喜好。如果你愿意,你甚至可以混合这两种风格。
Linq 关键字由 C# 编译器转换为方法调用语法。
不同的是,事实上,没有。
实际上,它是一回事,只是编译器将 $a$ 的表达式转换为与 $b$ 的表达式等效的表达式。