61

在选择使用 LINQ 查询语法或 LINQ 扩展方法之一中的 Lambda 表达式时,是否有人遵守任何规则(或者您是否被迫遵守雇主的任何规则?)?这适用于任何实体、SQL、对象、任何东西。

在我们的工作场所,我的老板根本不喜欢 lambda,他会对任何事情使用查询语法,在某些情况下,我发现它的可读性较差。

var names = collection.Select(item => item.Name);

var names = from item in collection
            select item.Name;

也许在添加条件时,我发现的 Lambda 有点混乱,其中

var names = collection.Where(item => item.Name == "Fred")
                      .Select(item => item.Name);

var names = from item in collection
            where item.Name == "Fred"
            select item.Name;

只是出于兴趣:编译器如何处理这个?有谁知道上面的 LINQ 查询将如何编译成 lambda?是否会Name为每个元素调用该属性?我们可以这样做并有可能提高性能吗?这是否意味着 lambda 在性能方面更加可控?

var names = collection.Select(item => item.Name)
                      .Where(name => name == "Fred");

当然,当我们开始使用越来越多的表达式时,lambda 会变得混乱,我会开始在这里使用查询语法。

var names = collection.Where(item => item.Name == "Fred")
                      .OrderBy(item => item.Age)
                      .Select(item => item.Name);

var names = from item in collection
            where item.Name == "Fred"
            order by item.Age
            select item.Name;

还有一些我发现无法使用查询语法完成的事情。您认为其中一些非常简单(尤其是聚合函数),但是不,您必须在最后添加一种 LINQ 扩展方法,imo 使用 lambda 表达式看起来更整洁。

var names = collection.Count(item => item.Name == "Fred");

var names = (from item in collection
            where item.Name == "Fred"
            select item).Count()

即使对于一些简单的 lambda 链,ReSharper也建议我将它们转换为 LINQ 查询。

其他人可以添加吗?有没有人有自己的小规则,或者他们的公司是否建议/强制使用一个?

4

1 回答 1

40

为了回答您关于翻译的问题,查询表达式将始终根据 C# 4 规范 7.16 的规则(或 C# 3 规范中的等效规则)进行翻译。在您询问有关Name属性的问题的示例中,这不是查询表达式转换的问题 - 这是SelectandWhere方法对它们作为参数的委托或表达式树所做的事情。有时在过滤之前进行投影是有意义的,有时则不是。

至于小规则,我只有一个:对所讨论的查询使用最易读的方式。因此,如果查询更改并且“哪种形式更易读”同时更改,请更改使用的语法。

如果您打算使用 LINQ,您应该对这两种语法感到满意,至少要阅读。

倾向于发现具有多个范围变量的查询(例如通过SelectManyorJoinlet子句)最终使用查询表达式更具可读性 - 但这远非硬性规定。

于 2011-11-07T14:19:35.560 回答