格式化LINQ查询的最佳方法

时间:2010-05-27 20:07:06

标签: .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);

格式提升

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);

阻止格式

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
        );

列表格式

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);

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

4 个答案:

答案 0 :(得分: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
  );

注意:

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

答案 1 :(得分:10)

我已经确定了Block格式。它暂时困扰了我对“浪费空间”的感觉,但最终每个人都觉得它更容易被更多人阅读。由于我们已经在新行上添加了大括号,因此它与其余代码更合适。解释的空间也较小。我们在公共商店中保存了一个带有格式化示例的cs文件......当有人想出一个独特的linq大块时,我们将它添加到文件中......真的有助于新人。

答案 2 :(得分:3)

对我来说,这取决于我必须进行的查询的长度。对于简短的简单语句,如基本选择或简单连接,我将使用列表格式化,因为它使得它很好并且易于阅读而不会将我的代码放在大量的行上。

如果我倾向于使用相当复杂或更大的linq语句,我会使用块格式化,以便其他人更容易阅读并遵循我想要做的事情。

我不认为对不同的陈述采用不同的格式是不好的做法,只要你对它的处理方式一致。

答案 3 :(得分:0)

非常主观。

我使用块格式化方法。

我还会检查针对Stylecop的代码,并确保它不会产生任何样式警告。