我有一个相当长的逻辑陈述,它需要分成多行。打破声明的最佳位置在哪里?是否存在拆分逻辑操作数和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)))));
我知道我可以通过一些方法调用来分解逻辑,但我真的想知道是否有人有关于如何缩进这些类型语句的约定。到目前为止,我还没有在网上找到任何运气。
答案 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)
我使用这些规则:
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)))));