我正在考虑.net项目的代码标准(c语言),我个人非常喜欢在IEnumerable等各种扩展方法中使用lambda表达式(Where,GroupBy,blah,blah)并且不太喜欢LINQ语法。
我知道这是个人偏好的事情,所以我不是问哪个是最好的,但对于我和我的团队,我们倾向于发现lambda方法更容易阅读。所以我想在我们的编码标准中总是使用Lambda方法,但我开始思考......
有什么东西只能用LINQ语法实现吗?我的意思是你可以使用LINQ构建一个特定的表达式树,你根本无法使用带有lambda表达式的扩展方法。我认为答案是否定的,因为像resharper和linqpad这样的工具能够在它们之间进行转换,而且我已经能够解决我在lambda中所需要的所有东西,但我想知道是否有一个边缘案例,聪明的人在在这里知道吗?
答案 0 :(得分:7)
“可能”和“方便”是不同的; p一切皆有可能; LINQ语法最终编译为lambda语法,并且有可能使用扩展语法,在LINQ语法中不可能(例如,在C#中Distinct()
,尽管它存在于VB.NET中LINQ)。
然而!当你在LINQ查询中有很多变量时,这很难映射,因为你需要对中间对象(可能是匿名类型)进行大量额外的投影;例如,尝试写(用lambda语法):
var query = from x in xSource
from y in x.SomeCollection
from z in zSource
let foo = x.Foo + z.SomeMethod()
order by foo
select new {x,y,z,foo};
可能,但坦率地说是PITA。
答案 1 :(得分:1)
表达式语法(from x in something ..
)由编译器转换为扩展方法语法。你可以使用扩展方法而不是表达式语法做更多的事情(虽然后者有时可能更简单)。
答案 2 :(得分:0)
LINQ exressions实际上是作为扩展方法编译的,编译器已经更新为能够做到这一点,但是在底层有IL根本不知道这个新语法。所以它实际上是另一种方式,你可以使用Linq无法做的扩展方法,更不用说你可以轻松地为自己创建新的扩展方法,你将无法从“Linq”调用语法“