【问题标题】:Is it Linq or Lambda?是 Linq 还是 Lambda?
【发布时间】:2011-11-15 12:33:15
【问题描述】:

我知道这是 Linq:

var _Results = from item in _List
                where item.Value == 1
                select item;

我知道这是 Lambda:

var _Results = _List.Where(x => x.Value == 1);

编者按:以上不只是Lambda,它是Linq使用“方法 语法”,其谓词是 Lambda。要清楚,以上两者 样本是 Linq (我原来的帖子不正确,但我留下了错误 来说明引发问题的混乱)。

但是 Linq 是 Lambda 的子集还是什么?

为什么会有两种看似相同的技术?

选择其中一个是否有技术原因?

【问题讨论】:

标签: c# linq lambda


【解决方案1】:

这是 LINQ(使用查询语法):

var _Results = from item in _List
                where item.Value == 1
                select item;

这也是 LINQ(使用方法语法):

var _Results = _List.Where(x => x.Value == 1);

有趣的是,both of these flavors 最终会生成完全相同的代码。编译器通过允许您以您喜欢的方式表达您的意愿为您提供服务。

this 是一个 lambda:

x => x.Value == 1

当您选择使用方法语法时,几乎总是可以在 lambda 表达式周围看到 LINQ。但是LINQlambdas是完全不同的两个东西,都可以自己使用。

更新:正如 svick 正确指出的那样,带有查询语法的 LINQ使用 lambda 表达式实现(如前所述,编译器允许您编写查询语法,但有效地将其转换为您背后的方法语法)。这只是基于两种风格完全等效并且行为方式相同的事实(例如,lambda 表达式可能会导致 closures 被创建)。

【讨论】:

  • 我认为值得一提的是,查询语法在幕后也使用了 lambda。由于闭包,这可能很重要。
【解决方案2】:

两者都是 Linq。第二个是使用 Lambdas

Lambda 是您在第二个示例中作为参数传递给 Where 函数的内联方法类型的东西。

这两种语法之间的区别纯粹是语法上的。第二种使用方法调用的 linq 风格是它在后台的工作方式。第一个是为了更加用户友好/更容易,编译器将其转换为幕后的方法调用。对于任何给定的查询,它们的工作方式应该相同,当然编译器可能会选择与转换为方法样式时相比,对复杂 linq 查询的解释略有不同。

这篇 msdn 文章可能也很有趣:LINQ Query Syntax versus Method Syntax。特别相关的是:“一般来说,我们推荐查询语法,因为它通常更简单、更易读;但是方法语法和查询语法之间没有语义差异。”

【讨论】:

  • 就我个人而言,我发现方法语法更具可读性——可能是因为我的大部分代码都是“LINQ to Objects”类型的。但是如果你有丰富的 SQL 经验,也许查询语法一开始会更容易理解。
  • @Tom Bushell,甚至 JOIN 语法?认真的吗?
  • @Tom Bushell:我也是。我在那个 MSDN 页面上解释了一些东西,这大概解释了为什么他们费心开发那种语法而不是仅仅拥有方法风格。我通常只做相对基本的事情,而不是连接或其他更复杂的事情(即主要是过滤或一对一映射操作)。
  • @Jerry - 和 Chris 一样,到目前为止,我的 LINQ 工作相当简单。我读过查询语法在执行 SelectMany、Join 或 GroupJoin 时通常更可取——我只是不需要做类似的事情——但是!
  • 内部“查询语法”在 LINQ to SQL 和 LINQ to Entities 团队中被称为“理解语法”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2010-09-20
相关资源
最近更新 更多