代码清理:在多行上拆分长语句的最佳方法

时间:2014-12-09 20:58:24

标签: c# linq indentation code-cleanup

我有一个相当长的逻辑陈述,它需要分成多行。打破声明的最佳位置在哪里?是否存在拆分逻辑操作数和linq lambda表达式的约定?带有ReSharper的Visual Studio 2013以这种方式格式化语句:

var b =
    wmsDocument.Document.Types.All(
        typePair => validTypes.Any(type => type.DocumentTypeId == typePair.DocumentTypeId &&
                                            (String.IsNullOrWhiteSpace(typePair.DocumentSubTypeId) ||
                                                (type.SubTypes != null &&
                                                type.SubTypes.Any(
                                                    subType =>
                                                        subType.DocumentSubTypeId == typePair.DocumentSubTypeId)))));

我知道我可以通过一些方法调用来分解逻辑,但我真的想知道是否有人有关于如何缩进这些类型语句的约定。到目前为止,我还没有在网上找到任何运气。

3 个答案:

答案 0 :(得分:6)

有多种方法可以做到这一点。这取决于您在紧凑和可读之间绘制线的位置。这将是可读的一面,虽然稍微冗长,但至少允许嵌套的linq表达式中的注释。

//determine if every document type
var b = wmsDocument.Document.Types.All
(
    //contains at least one typePair
    typePair => validTypes.Any
    (
        //where the type's id and the typePair's id are equal
        type => type.DocumentTypeId == typePair.DocumentTypeId && 
        (
            //and the subtype's id has a value
            String.IsNullOrWhiteSpace(typePair.DocumentSubTypeId) || 
            (
                //or the subtype collection is populated and contains a matching subtypeid
                type.SubTypes != null && type.SubTypes.Any
                (
                    subType => subType.DocumentSubTypeId == typePair.DocumentSubTypeId
                )
            )
        )
     )
);

答案 1 :(得分:3)

很难说这个问题有一个很好的答案。这真的是品味问题。就个人而言,我喜欢打破点上的LINQ查询。

var result = data
               .Where(a => a == someValue)
               .Take(5)
               .ToList();

另外,我更喜欢将每个条件放在一个单独的行中:

if (a == b ||
    b == c ||
    c == a)
{

}

将这两个首选项应用于您的查询我得到了类似的内容:

var b =
    wmsDocument.Document.Types
    .All(typePair => validTypes
        .Any(type => type.DocumentTypeId == typePair.DocumentTypeId && 
            (String.IsNullOrWhiteSpace(typePair.DocumentSubTypeId) ||
            (type.SubTypes != null && 
            type.SubTypes
                .Any(subType => subType.DocumentSubTypeId == typePair.DocumentSubTypeId)))));

答案 2 :(得分:2)

我使用这些规则:

  • 如果lambda表达式中的行太长,则将定义x=>放在一行中,并将其声明放在新行中。
  • 打破逻辑操作,使其对齐,以便通过操作员显示哪些操作数相互关联。

所以你的代码将是这样的

var b = wmsDocument.Document.Types.All(typePair =>
    validTypes.Any(type =>
        type.DocumentTypeId == typePair.DocumentTypeId &&
        (string.IsNullOrWhiteSpace(typePair.DocumentSubTypeId) ||
         (type.SubTypes != null &&
          type.SubTypes.Any(subType =>
              subType.DocumentSubTypeId == typePair.DocumentSubTypeId)))));