2013-04-09 95 views
8

我的代码(C#)上有3个布尔值,而int32属性取决于哪些布尔值是truefalse。 最新最好的方式做到这一点的另一种方式比if语句,如:在C#语句中检查多个布尔条件的最佳方法

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

编辑:3个布尔必须让每一个组合可以设置Int32值。

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

+4

如果总是恰好有三个布尔值,你可以建一个表时间提前,然后只是仰望使用布尔值作为键的具体项目。 – cdhowie 2013-04-09 14:44:52

+0

整数数组,然后3个布尔值作为单个位来索引正确的条目。一种二叉树的紧凑表示。 – 2013-04-09 14:46:29

+0

致编辑:我的答案显示如何从组成条件计算“组合指数” – sehe 2013-04-09 14:53:36

回答

25

这是更好地捕捉操作的意图,而不是明确检查布尔值。

例如:

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

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

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

+1强烈同意,以最紧凑的方式检查条件,我们不应该忘记该域。 – 2013-04-09 14:48:41

+0

也在这里。我仍然发布我的答案,因为从OP不清楚他的情况适合'描述性域名' – sehe 2013-04-09 14:52:37

+1

如果他想使简洁的代码这种打败目的 – SamFisher83 2013-04-09 14:53:50

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

2

我想现在你做的事情是完全没有任何其他的解决方案将降低到偏爱。

我的偏好,它适用的地方是如果可能的话将检查分开。

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

这将是你需要发布一个功能,如用户是否登录,如果参数存在,并且是在正确的背景下,与其他物品一起前检查一定prereqs事件是有用的。

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

0

我看不出有什么错你怎么做,但如果输出是相同的您可以通过创建真值表并简化条件来简化的多个条件,从而可以简化

例如,如果d0随时a是假的,你可以简化为:

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

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

但是,如果你有8个不同结果(一个为ab每个组合,与c),那么你的方法是好的。

9

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

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

+0

这是我感到震惊的最佳解决方案,因此许多人没有提出这个建议。 – 2013-04-09 15:23:37

+1

@Rhhound很多人只是喜欢写逻辑,因为它出现了,而不是它如何有效地结合,最终; K-maps只关注结果,并且无情地消除来自输入的任何不会影响结果的信息。因此,这些信息从源头上不再明显。海恩,源不再是功能需求的反映。它是_harder_证明是正确的,而不是_easier_。更难维护(修改)。相反,通常你应该让编译器担心优化(即使在内联之后也可能发生)。 – sehe 2013-11-04 22:08:50