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

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

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

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

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

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

例如:

 public void Check() { if (HasOrdered()) { // do logic } } private bool HasOrdered() { return a && !b && !c; } private bool HasBooked() { return a && b && !c; } 

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

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

我认为你现在所做的事情非常好,任何其他解决方案都会优先考虑。

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

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

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

就像我说的那样可能不适用,但我只是想发表意见

您可以执行@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); 

我没有看到你如何做它有什么问题,但如果输出对于多个条件是相同的,你可以通过创建一个真值表并简化条件来简化。

例如,如果d任何时候 d应为0 ,则可以简化为:

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

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

但是,如果你有8个不同的结果( abc每个组合a ),那么你的方法很好。