【问题标题】:.NET LINQ query syntax vs method chain.NET LINQ 查询语法与方法链
【发布时间】:2011-04-16 03:35:51
【问题描述】:

以下两个语句在性能上有区别吗?

from item in collection 
where item.id == 3
select item

collection.Where(item => item.id ==3)

一般来说,LINQ 语法和方法链在性能上有区别吗?

【问题讨论】:

  • 更准确地说是“理解表达式”和“流利的接口”(在前一种情况下是因为 C# 查询语法与 LINQ 无关,而在后一种情况下因为通常称为方法链接)。

标签: .net linq performance


【解决方案1】:

不,因为它们被编译成完全相同相同的代码。

基本上查询表达式被编译器“预处理”成“没有查询表达式的 C# 3”,然后正常应用重载规则、lambda 表达式转换等。这是一个非常优雅的系统,这意味着查询表达式的规则仅限于规范的一小部分。

当然,由于使用了其他重载或根本不支持方法(例如Count()),您可以用“链式方法”语法编写无法用查询表达式语法编写的各种内容 -但除非您使用这些,否则编译后的代码将完全相同。为任何特定场景选择最易读的替代方案。

【讨论】:

  • 为了完整起见,考虑到问题与性能有关,请谨慎提及两种替代方案之间的编译时间可能存在细微差异;第二种选择可能会更快。
  • @Ani:根据我的经验,关于性能的问题非常非常很少涉及编译速度。我希望 OP 能够明确地指定如果这就是他的意思。我认为除非另有说明,否则假设“性能”是指“执行时的性能”是合理的。
  • 我同意。只是为了完整性。
  • @JonSkeet - 出于好奇,您有偏好使用哪个?
  • @TravisJ:对于特定情况而言,哪个最简单。我喜欢用于连接和分组的查询表达式——任何会引入透明标识符的东西——但对于更直接的查询,我喜欢直接的方法调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
相关资源
最近更新 更多