我的代码(C#)上有 3 个布尔值和一个int32
取决于布尔值true
和false
. 以另一种方式完成此任务的最佳方法是什么,而不是 if 语句,例如:
if(a && b && !c)
d = 1;
if(a && !b && !c)
d = 2;
//etc.. ect...
编辑: 3 个布尔值必须具有所有可能的组合才能设置 int32 值。
编辑 2:对于两个不同的布尔比较,“d”的值可以相同。
我的代码(C#)上有 3 个布尔值和一个int32
取决于布尔值true
和false
. 以另一种方式完成此任务的最佳方法是什么,而不是 if 语句,例如:
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。
假设您已经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);
我认为您现在所做的一切都很好,任何其他解决方案都将取决于偏好。
如果可能的话,我的偏好是分开结帐。
if (!a)
return;
if (!b)
return;
if (!c)
return;
如果您需要在发出函数之前检查某些先决条件,这将很有用,例如用户是否已登录,参数是否存在并且在正确的上下文中,以及其他项目。
就像我说的,这可能不适用,但我只是想表达我的意见
我认为您的操作方式没有任何问题,但是如果多个条件的输出相同,则可以通过创建真值表并简化条件来简化。
例如,如果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
),那么您的方法就可以了。