c# - LINQ - 查询语法与方法链和 lambda

标签 c# .net linq lambda linq-query-syntax

<分区>

在选择在其中一种 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 扩展方法,在我看来,使用 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 查询。

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

最佳答案

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

至于小规则,我只有一个:使用对相关查询最易读的方式。因此,如果查询发生变化并且“哪种形式更具可读性”同时发生变化,请更改使用的语法。

如果您要使用 LINQ,您应该对任何一种语法感到满意,至少要阅读。

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

关于c# - LINQ - 查询语法与方法链和 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8037677/

相关文章:

.net - 如果.NET使用mark&sweep GC,为什么它会将内存地址空间减少一半?

c# - 为什么每个 Dispatcher.BeginInvoke 回调都有一个唯一的同步上下文?

c# - 包含 namespace 的 XDocument

c# - 使用 firstordefault 时指定的转换无效

c# - EF6 Linq 查询。仅包括返回子表的第一个条目

c# - 是否有任何正当理由忽略捕获的异常

c# - 未经授权的 webapi 调用返回登录页面而不是 401

c# - 将 URL 转换为 C# 字符串中的超链接的最简单方法?

c# - 纹理 2D 坐标未显示在正确的位置

c# - Json.NET 和混淆,反序列化不起作用