我的代码(C#)上有3个布尔值,int32
属性取决于true
和false
的布尔值。
什么是最好的方式,以另一种方式实现这一点,而不是如下语句:
if(a && b && !c)
d = 1;
if(a && !b && !c)
d = 2;
//etc.. ect...
编辑:3个布尔值必须具有设置int32值的所有组合。
编辑2:对于两个不同的布尔比较,“d”的值可以相同。
答案 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。
答案 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;
或者,如果存在某种数学模式(例如a
,b
和c
表示二进制数的三位数),那么您可以进行位运算。
但是,如果您有8个不同的结果(a
,b
和c
的每个组合一个),那么您的方法就可以了。