2010-05-27 102 views
38

之前你忽略/票到接近这个问题,我认为这是一个有效要问的问题,因为代码清晰是一个重要的讨论话题,这是必须编写维护的代码和我非常感谢那些曾经遇到过这个问题的人的回答。最佳方式查询

我最近遇到这个问题,因为大量的嵌套,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的格式标准,使其最大限度地提高可读性&理解和看起来干净和专业。到目前为止,我无法做出决定,所以我把问题转给这里的专业人士。

+0

看看ReSharper和CodeRush。它们都为LINQ语句和查询解析提供自动格式。我发现他们在制作可读,易理解的格式方面做得很好。 – LBushkin 2010-05-27 20:09:06

+4

我使用resharper,它往往是完全不一致的linq格式添加全面的缩进缩进。 – Aren 2010-05-27 20:13:00

+1

为什么不使用linq语法suger:(来自sInitRegistrationSources group by iRegion,i.Inventory select new {Inventory = src.Value.GetInventory(product.OriginalProductID,true),Region = src.Value.Region }); ? – TcKs 2010-05-27 20:27:13

回答

9

我已经解决了块格式。它困扰了我一段时间的“浪费空间”的感觉,但最终每个人都觉得它更容易被更多人阅读。由于我们已经将新括号放在新行上,所以它只适用于其他代码。解释的空间也较小。我们在公共商店中保存一个cs文件,该文件格式化示例...当有人想出一个独特的linq我们将其添加到文件中时...真的可以帮助新人。

+0

是的,这是我在考虑块格式时首先想到的'浪费空间'的因素,但它确实增加了可读性。 – Aren 2010-05-27 20:42:15

0

它非常主观。

我使用块格式化方法。

我还检查了防止Stylecop的代码,并确保它不会产生任何stylecop警告。

+0

我知道这部分是主观的,但这就是为什么我希望人们会提供格式背后的推理。 – Aren 2010-05-27 20:13:45

3

对我来说,这取决于我必须做的查询的长度。对于简单的简单语句,例如基本选择或简单连接,我将使用ListList格式,因为它使得它很容易阅读,而无需将我的代码放在负载线上。

如果我倾向于有一个相当复杂或更大的linq语句,我会使用块格式,以便让其他人更容易阅读并遵循我正在尝试执行的操作。

我不认为这是不好的做法,不同的语句格式不同,只要你符合你的方式。

16

我的格式:

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匹配包含开幕paren行的缩进。
  • src => new留在与Select相同的行上,因为它只是不值得换行。
  • 匿名类型总是得到块处理,就像它在查询之外使用一样(但关闭paren不值得换行)。
  • 通常不会调用两个参数GroupBy过载。虽然它可以很容易地放在一条线上,但可以使用额外的一行来清楚说明发生了一些不寻常的事情。
+2

+1这是我自然而然的原因,也是出于同样的原因。 – jsmith 2010-05-29 03:55:25

+0

就像我的。但写什么'system.InventorySources.Select(src => src.Value.Region)'你会写在单行或分成多行不破坏你的缩进标准?这是我很困惑的东西:)我知道这是一件小事,但仍然... – sotn 2017-07-20 12:02:29

+0

如果只有一个方法调用一个lambda,并且它没有超过所需的行长度,我将它作为一条线。 – 2017-07-20 16:52:16