是Linq还是Lambda?

Jer*_*xon 96 c# linq lambda

我知道这是Linq:

var _Results = from item in _List
                where item.Value == 1
                select item;
Run Code Online (Sandbox Code Playgroud)

我知道这是Lambda:

var _Results = _List.Where(x => x.Value == 1);
Run Code Online (Sandbox Code Playgroud)

编者注:以上不仅仅是Lambda,Linq使用的是"方法语法",其谓词是Lambda.需要说明的是,以上两个样本都是Linq(我原来的帖子不正确,但我留下了错误来说明提示问题的混乱).

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

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

是否有技术上的理由来选择其中一个?

Jon*_*Jon 126

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

var _Results = from item in _List
                where item.Value == 1
                select item;
Run Code Online (Sandbox Code Playgroud)

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

var _Results = _List.Where(x => x.Value == 1);
Run Code Online (Sandbox Code Playgroud)

有趣的是,这两种口味最终会产生完全相同的代码.编译器允许您以您喜欢的方式表达您的意愿,为您提供服务.

是一个lambda:

x => x.Value == 1
Run Code Online (Sandbox Code Playgroud)

当您选择使用方法语法时,LINQ几乎总是在lambda表达式中出现.但LINQlambdas是两个完全不同的东西,两者都可以自己使用.

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

  • 我认为值得一提的是查询语法也在幕后使用lambdas.由于封闭,这可能很重要. (2认同)

Chr*_*ris 34

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

Lambdas是内联方法类型的东西,您将作为参数传递给第二个示例中的Where函数.

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

这篇msdn文章也可能是有趣的:LINQ查询语法与方法语法.特别相关的是:"一般来说,我们建议使用查询语法,因为它通常更简单,更易读;但是方法语法和查询语法之间没有语义差异."

  • 就个人而言,我发现方法语法更具可读性 - 也许是因为我的大部分代码都属于"LINQ to Objects".但是如果你有很多SQL经验,那么查询语法最初可能会更容易理解. (6认同)