格式化LINQ查询的最佳方法

Are*_*ren 41 .net linq formatting code-readability

在您忽略/投票关闭此问题之前,我认为这是一个有效的问题,因为代码清晰度是讨论的一个重要主题,编写可维护代码至关重要,我非常感谢那些之前遇到过这些问题的人的答案. .

我最近遇到了这个问题,由于嵌套量很大,LINQ查询可能会非常快速.

下面是我提出的格式差异的一些示例(对于相同的相对非复杂的查询)

没有格式化

var allInventory = system.InventorySources.Select(src => new { Inventory = src.Value.GetInventory(product.OriginalProductId, true), Region = src.Value.Region }).GroupBy(i => i.Region, i => i.Inventory);
Run Code Online (Sandbox Code Playgroud)

提升格式

var allInventory = system.InventorySources
    .Select(src => 
        new { 
            Inventory = src.Value.GetInventory(product.OriginalProductId, true), 
            Region = src.Value.Region })
                .GroupBy(
                    i => i.Region, 
                    i => i.Inventory);
Run Code Online (Sandbox Code Playgroud)

块格式

var allInventory = system.InventorySources
    .Select(
        src => new 
        { 
            Inventory = src.Value.GetInventory(product.OriginalProductId, true), 
            Region = src.Value.Region 
        })
        .GroupBy(
            i => i.Region, 
            i => i.Inventory
        );
Run Code Online (Sandbox Code Playgroud)

列表格式

var allInventory = system.InventorySources
    .Select(src => new { Inventory = src.Value.GetInventory(product.OriginalProductId, true), Region = src.Value.Region })
    .GroupBy(i => i.Region, i => i.Inventory);
Run Code Online (Sandbox Code Playgroud)

我想提出一个linq格式的标准,以便最大化可读性和理解,看起来干净和专业.到目前为止,我无法决定,所以我将问题转交给专业人士.

Amy*_*y B 19

我的格式:

var allInventory = system.InventorySources
  .Select(src => new
  {
    Inventory = src.Value.GetInventory(product.OriginalProductId, true),
    Region = src.Value.Region
  })
  .GroupBy(
    i => i.Region,
    i => i.Inventory
  );
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 在方法上打开parens永远不值得换行.
  • 关闭parens匹配包含开始paren的行的缩进.
  • src => new与Select保持在同一行,因为它不值得换行.
  • 匿名类型总是得到块处理,就像它在查询之外使用一样(但是关闭的paren不值得新行).
  • 通常不会调用两个参数GroupBy重载.虽然它可以很容易地放在一条线上,但是使用额外的线条可以清楚地表明发生了一些不寻常的事情.

  • +1这是我自然而然的,并且出于同样的原因. (2认同)
  • 如果只有一个带有一个 lambda 的方法调用并且它没有超过所需的行长度,我会将其保留为一行。 (2认同)

Rus*_*sty 10

我已经确定了块格式.它暂时困扰了我对"浪费空间"的感觉,但最终每个人都觉得它更容易被更多人阅读.由于我们已经在新行上添加了大括号,因此它与其余代码更合适.解释的空间也较小.我们守在公用存储的CS文件已格式化的例子......当有人来了,我们把它添加到文件LINQ的独特大块......真的帮助新球员.