缩短if语句具有相同条件

时间:2014-12-12 08:56:32

标签: c# dry

我在这里比较boolB两次,这段代码看起来需要改进。是否有可能写出不同的内容来减少代码重复?

if (boolA)
{
  if (boolB)
  {
    return "A";
  }

  return "B";
} 

if (boolB)
{
   return "C";
}

return "D";

3 个答案:

答案 0 :(得分:6)

嗯,你可以使用条件运算符使其更清晰 - 至少在我看来:

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作为条件两次,请注意。

答案 1 :(得分:2)

这个怎么样?它使用布尔值来确定数组中的索引。

string[] vals = new string[] { "A", "B", "C", "D" };

return vals[(boolA ? 0 : 2) + (boolB ? 0 : 1)];

或者,如果char也很好:

return (char)(65 /* 'A' */ + (boolA ? 0 : 2) + (boolB ? 0 : 1));

答案 2 :(得分:1)

发布的答案略有变化,避免了所有逻辑操作:

return new string(new[]
    {
        (char)('D' - ((Convert.ToInt32(boolA) << 1) | Convert.ToInt32(boolB)))
    });

修改

在我的测试中,它的价值在于从控制台运行并在发布模式下编译。我得到以下结果。

注意,我必须改变Patrik Hofman的char算术函数来返回一个字符串。

超过short.MaxValue * 100次均匀分布的测试数据,我得到了这些结果,

TernaryShort:101ms
TernaryLong:102ms (1467515 ticks)
Original:102ms (1467551 ticks)
Lookup:104ms
ConvertChar:768ms
LogicalChar:953ms

这种模式在执行之间一致地重复。

因此,Jon Skeet's短三元表达式在代码大小和代码性能方面都有一个真实但微不足道的优势。