9

我的代码(C#)上有 3 个布尔值和一个int32取决于布尔值truefalse. 以另一种方式完成此任务的最佳方法是什么,而不是 if 语句,例如:

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

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

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

4

5 回答 5

31

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

例如:

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

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

private bool HasBooked()
{
    return a && b && !c;
}
于 2013-04-09T14:47:11.303 回答
12

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

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

于 2013-04-09T14:49:23.370 回答
2

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

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);

于 2013-04-09T14:46:40.593 回答
2

我认为您现在所做的一切都很好,任何其他解决方案都将取决于偏好。

如果可能的话,我的偏好是分开结帐。

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

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

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

于 2013-04-09T14:48:38.743 回答
0

我认为您的操作方式没有任何问题,但是如果多个条件的输出相同,则可以通过创建真值表并简化条件来简化。

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

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

或者,如果有一些数学模式(例如,,,ab表示c二进制数的三位),那么您可以进行位算术。

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

于 2013-04-09T14:48:58.977 回答