三元运算符难读
Ternary operator difficult to read
有什么建议可以使下面的查询更多"readable"?
var result = result
.OrderBy(a =>
(conditionA) ?
valueA :
(conditionB ? valueB :
(conditionC ?
(conditionD ?
valueC : valueD) :
valueE)));
condition 和 value 的代码太长,读起来很费劲。
有多种方法可以提高代码的可读性。
缩进
一种方法是以稍微不同的方式缩进代码,但这只会稍微提高可读性:
var result = result.OrderBy(a =>
conditionA ? valueA :
conditionB ? valueB :
conditionC ? conditionD ? valueC :
valueD :
valueE);
如果,否则
您还可以将这些三元运算符变成更易读的 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<>
一种选择是编写您自己的 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())
有什么建议可以使下面的查询更多"readable"?
var result = result
.OrderBy(a =>
(conditionA) ?
valueA :
(conditionB ? valueB :
(conditionC ?
(conditionD ?
valueC : valueD) :
valueE)));
condition 和 value 的代码太长,读起来很费劲。
有多种方法可以提高代码的可读性。
缩进
一种方法是以稍微不同的方式缩进代码,但这只会稍微提高可读性:
var result = result.OrderBy(a =>
conditionA ? valueA :
conditionB ? valueB :
conditionC ? conditionD ? valueC :
valueD :
valueE);
如果,否则
您还可以将这些三元运算符变成更易读的 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<>
一种选择是编写您自己的 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())