有关如何使以下查询更具“可读性”的任何建议吗?
var result = result
.OrderBy(a =>
(conditionA) ?
valueA :
(conditionB ? valueB :
(conditionC ?
(conditionD ?
valueC : valueD) :
valueE)));
用条件和价值的长代码难以阅读。
答案 0 :(得分:5)
有几种方法可以提高代码的可读性。
<强>压痕强>
一种方法是以稍微不同的方式缩进代码,但这只会略微提高可读性:
var result = result.OrderBy(a =>
conditionA ? valueA :
conditionB ? valueB :
conditionC ? conditionD ? valueC :
valueD :
valueE);
if,else
您还可以将这些三元运算符转换为if
,else
更易读的链。
var result = Result.OrderBy(a => {
if (conditionA)
{
return valueA;
}
else if (conditionB)
{
return valueB;
}
else if (conditionC)
{
if (conditionD)
{
return valueC;
}
else
{
return valueD;
}
}
else
{
return valueE;
}
});
<强>的IComparer&LT;&GT; 强>
一种选择是编写自己的IComparer<>
实现并将其传递给OrderBy
方法。我不知道您的对象的类型或代码中键的类型,因此我将假设string
个键。
public class MyClassComparer : IComparer<MyClass>
{
public int Compare(MyClass x, MyClass y)
{
string xKey = getKey(x);
string yKey = getKey(y);
return string.Compare(xKey, yKey);
}
private string getKey(MyClass item)
{
if (item.conditionA)
{
return item.valueA;
}
else if (item.conditionB)
{
return item.valueB;
}
else if (item.conditionC)
{
if (item.conditionD)
{
return item.valueC;
}
else
{
return item.valueD;
}
}
else
{
return item.valueE;
}
}
}
扩展方法
最后一个选项是将代码移动到扩展方法:
public static class MyClassExtensions
{
public static string GetSortingKey(this MyClass item)
{
if (item.conditionA)
{
return item.valueA;
}
else if (item.conditionB)
{
return item.valueB;
}
else if (item.conditionC)
{
if (item.conditionD)
{
return item.valueC;
}
else
{
return item.valueD;
}
}
else
{
return item.valueE;
}
}
}
使用最后一个选项,您对OrderBy
的呼叫就是:
result.OrderBy(a => a.GetSortingKey())