Is it Linq or Lambda?

我知道这是 Linq:

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

And I know this is Lambda:

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

Editor's note: the above is not merely Lambda, it is Linq using the "Method 其谓词是 Lambda 样品是 Linq (我原来的帖子是不正确的,但我留下了错误 为了说明引起这个问题的困惑)。

但 Linq 是 Lambda 的子集吗?

为什么会有两个看起来一模一样的技术人员?

有没有技术上的理由选择其中一个?

57052 次浏览

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

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

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

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

值得注意的是,这两种口味最终将生成完全相同的代码。编译器为您提供了一种服务,允许您以您喜欢的方式表达您的愿望。

这个是一个 lambda:

x => x.Value == 1

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

更新: 正如 svick 正确地指出的那样,带有查询语法的 LINQ 是使用 lambda 表达式实现的 also(正如前面提到的,编译器允许你编写查询语法,但是有效地将它转换为背后的方法语法)。这只是加重了这样一个事实,即两种风格是完全等价的,并且将以相同的方式运行(例如,lambda 表达式可能会导致创建 closures)。

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

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

这两种语法之间的区别纯粹是语法上的。使用方法调用的第二种 linq 样式是它在底层的工作方式。第一种方法意味着更加用户友好/简单,编译器将其转换为幕后的方法调用。它们对于任何给定的查询都应该是一样的,当然,编译器对于复杂的 linq 查询可能会选择一个稍微不同的解释,而不是你在转换为方法样式时所选择的解释。

这个 msdn 文章可能也感兴趣: 查询语法与方法语法。特别相关的是: “一般来说,我们推荐查询语法,因为它通常更简单,更易读; 但是方法语法和查询语法之间没有语义上的区别。”