我知道这是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的子集还是什么?
为什么有两个看似相同的技术?
是否有技术上的理由选择其中一个?
答案 0 :(得分:124)
这是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最终将生成完全相同的代码。编译器允许您以您喜欢的方式表达您的意愿,为您提供服务。
这个是一个lambda:
x => x.Value == 1
当您选择使用方法语法时,LINQ几乎总是可以看到lambda表达式。但是LINQ和lambdas是两个完全不同的东西,两者都可以单独使用。
更新:正如svick正确指出的那样,带有查询语法的LINQ 也使用lambda表达式实现(如前所述,编译器允许您使用查询语法编写但是有效地将其转换为背后的方法语法)。这只是因为这两种风格完全相同并且行为方式相同(例如,lambda表达式可能导致closures被创建)。
答案 1 :(得分:33)
两者都是Linq。第二个是使用 Lambdas。
Lambdas是内联方法类型的东西,您将作为参数传递给第二个示例中的Where函数。
这两种语法之间的区别纯粹是语法。使用方法调用的第二个linq样式是它在引擎盖下的工作方式。第一个是更加用户友好/更容易,编译器将其转换为幕后方法调用。对于任何给定的查询,它们应该工作相同,当然编译器可能会选择对转换为方法样式时复杂的linq查询的不同解释。
这篇msdn文章也可能有趣:LINQ Query Syntax versus Method Syntax。特别相关的是:“一般来说,我们建议使用查询语法,因为它通常更简单,更易读;但是方法语法和查询语法之间没有语义差异。”