在C#if语句中检查多个布尔条件的最佳方法

时间:2013-04-09 14:43:21

标签: c# if-statement boolean

我的代码(C#)上有3个布尔值,int32属性取决于truefalse的布尔值。 什么是最好的方式,以另一种方式实现这一点,而不是如下语句:

if(a && b && !c)
   d = 1;
if(a && !b && !c)
   d = 2;
//etc.. ect...

编辑:3个布尔值必须具有设置int32值的所有组合。

编辑2:对于两个不同的布尔比较,“d”的值可以相同。

5 个答案:

答案 0 :(得分:26)

最好捕获操作的意图,而不是显式检查布尔值。

例如:

public void Check()
{
   if (HasOrdered())
   {
      // do logic
   }
}

private bool HasOrdered()
{
    return a && !b && !c;
}

private bool HasBooked()
{
    return a && b && !c;
}

答案 1 :(得分:11)

您可以使用卡诺图来减少方程式并减少ifs。

https://en.wikipedia.org/wiki/Karnaugh_map

答案 2 :(得分:2)

您可以执行@Adriano给出的查找表提示,假设您lookup_table填充了索引[0..8]的值:

var index = new [] { a,b,c }.Aggregate(0, (a,i) => return 2*a + (i?1:0));

int d = lookup_table[index];

编辑问题的编辑使这无关紧要: d是什么意思?

<击>

如果是假值的计数(可能来自示例代码),请将其设为

int d = new [] { a,b,c }.Count(b => !b);

<击>

答案 3 :(得分:2)

我认为你现在所做的事情完全没问题,任何其他解决方案都会优先考虑。

我的偏好,适用的地方是尽可能将支票分开。

 if (!a)
    return;
 if (!b)
    return;
 if (!c)
    return;

如果您需要在发布函数之前检查某些先决条件,这将非常有用,例如,如果用户已登录,参数是否存在且位于正确的上下文中,以及其他项目。

就像我说这可能不适用但我只是想发表意见

答案 4 :(得分:0)

我没有看到任何错误与你如何做,但如果输出对于多个条件是相同的,你可以能够简化如果通过创建真值表并简化条件。

例如,如果d 0 随时 a为假,则可以简化为:

if(a) 
   if(b && !c)
       d = 1;
   if(!b && !c)
       d = 2;
   ...
else
    d = 0;

或者,如果存在某种数学模式(例如abc表示二进制数的三位数),那么您可以进行位运算。

但是,如果您有8个不同的结果(abc的每个组合一个),那么您的方法就可以了。