C# 在相同条件下缩短if语句
我在这里比较了两次boolB,这段代码看起来需要改进。是否可以编写不同的代码来减少代码重复C# 在相同条件下缩短if语句,c#,dry,C#,Dry,我在这里比较了两次boolB,这段代码看起来需要改进。是否可以编写不同的代码来减少代码重复 if (boolA) { if (boolB) { return "A"; } return "B"; } if (boolB) { return "C"; } return "D"; 好吧,你可以使用一个条件运算符来让它更清楚-至少在我看来: return boolA && boolB ? "A" : boolA ? "B" : b
if (boolA)
{
if (boolB)
{
return "A";
}
return "B";
}
if (boolB)
{
return "C";
}
return "D";
好吧,你可以使用一个条件运算符来让它更清楚-至少在我看来:
return boolA && boolB ? "A"
: boolA ? "B"
: boolB ? "C"
: "D";
一旦您习惯了这种编写多个条件运算符的方法,它将非常清楚地理解为一种伪模式匹配方法
诚然,这确实会多次评估条件。有很多方法可以避免,但我不确定它们是否好。。。例如:
int bits = (boolA ? 2 : 0) | (boolB ? 1 : 0);
switch(bits)
{
case 3: return "A";
case 2: return "B";
case 1: return "C";
case 0: return "D";
default: throw new InvalidOperationException("The world has gone mad!");
}
或者使用不同的方法嵌套条件:
return boolA ? (boolB ? "A" : "B")
: boolB ? "C"
: "D";
请注意,这仍然将boolB表示为一个条件两次。这个呢?它使用布尔值来确定数组中的索引
string[] vals = new string[] { "A", "B", "C", "D" };
return vals[(boolA ? 0 : 2) + (boolB ? 0 : 1)];
或者,如果字符也很好:
return (char)(65 /* 'A' */ + (boolA ? 0 : 2) + (boolB ? 0 : 1));
张贴答案的细微变化避免了所有逻辑操作:
return new string(new[]
{
(char)('D' - ((Convert.ToInt32(boolA) << 1) | Convert.ToInt32(boolB)))
});
这种模式在执行之间持续重复
因此,无论是在代码大小还是在代码性能方面,短三元表达式都有一个真正但很小的优势。实际的逻辑不能真正减少,但如果布尔值是方法调用,那么您可以在此之前设置临时变量来存储其结果。我只是编写了一种类似的方法,但是使用开关而不是创建数组…@JonSkeet:我看到了。选择也不错。如果值是字符,你甚至可以使用ASCII值。@JonSkeet:也添加了该选项。是的,我的意思是不需要像int'a那样进行额外的转换。@Rawling:我的错。谢谢。你还要多次评估条件吗?原始表达式没有,但条件表达式可以对boolA执行两次。@Rawling:你说得对-对不起,出于某种原因错过了。我相信短三元表达式实际上更快,也更短。
TernaryShort:101ms
TernaryLong:102ms (1467515 ticks)
Original:102ms (1467551 ticks)
Lookup:104ms
ConvertChar:768ms
LogicalChar:953ms