C# 在相同条件下缩短if语句

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

我在这里比较了两次boolB,这段代码看起来需要改进。是否可以编写不同的代码来减少代码重复

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