同时检查几个布尔返回值

时间:2013-12-03 10:03:14

标签: c# asp.net boolean logic boolean-logic

我有几个bool元素,如果返回false,我正在检查它。

bool i = false;
        switch (idcount)
        {
            case 1: i = p1(); break;
            case 2: i = p1() & p2(); break;
            case 3: i = p1() & p2() & p3(); break;
            case 4: i = p1() & p2() & p3() & p4(); break;
            case 5: i = p1() & p2() & p3() & p4() & p5(); break;
            case 6: i = p1() & p2() & p3() & p4() & p5() & p6(); break;
            case 7: i = p1() & p2() & p3() & p4() & p5() & p6() & p7(); break;
            }
return i;

我想如果p *()中的一个在任何情况下返回false,则返回false。 是正确的方式还是两个错误的回报都是真的? 我希望所有p *()返回true我返回true ..

6 个答案:

答案 0 :(得分:7)

使用&&(逻辑和)而非&(二元运算符)

喜欢:

p1() && p2();

只有当所有p*()都为真时才会返回true(与&相同),但请注意,如果第一个p*()将返回false,则不会计算其余的表达式。如果&整个表达式将被评估

var functions = new List<Func<bool>>();
functions.Add(p1);
functions.Add(p2);
functions.Add(p3);
functions.Add(p4);
functions.Add(p5);
functions.Add(p6);
functions.Add(p7);
return functions.Take(idcount).All(x=>x());

尝试上面看起来比switch语句更清晰,并应检查所有第一个idcount条目是否与&&

的switch case相同

答案 1 :(得分:2)

当然,您的代码应该像您想要的那样工作,但是我想使用以下紧凑代码:

List<Func<bool>> ps = new List<Func<bool>>();
ps.Add(p1);
ps.Add(p2);
ps.Add(p3);
ps.Add(p4);
ps.Add(p5);
ps.Add(p6);
ps.Add(p7);
var i = ps.Take(idcount).All(a=>a());

要使用普通for循环,您可以执行以下操作:

var i = true;  
if(ps.Count >= idcount){
  for(int i = 0; i < idcount; i++){
    if(!ps[i]()) { i = false; break;}
  } 
} //else ???

答案 2 :(得分:1)

即使您在false中获得p1(),使用& bit wise operator也会导致评估所有表达式。您应该使用&& logical operator来组合条件。

二进制&amp;运算符是为整数类型和bool预定义的。对于整体类型,&amp;计算其操作数的逻辑按位AND。对于bool操作数,&amp;计算其操作数的逻辑AND;也就是说,当且仅当它的两个操作数都为真时,结果才为真。 &amp;运算符评估两个运算符,而不管第一个运算符的值MSDN

条件AND运算符(&amp;&amp;)执行其bool操作数的逻辑AND,但仅在必要时{for} MSDN计算其第二个操作数。

答案 3 :(得分:0)

您应该使用&&,它是逻辑(true / false)值的运算符。

i = p1() && p2();

&是数字的按位AND运算符。

答案 4 :(得分:0)

考虑到你所声明的不变量

  

我想如果p *()中的一个在任何情况下返回false,则返回false。是正确的方式还是两个错误的回报都是真的?我希望所有p *()返回true我返回true ..

你的代码是正确的。

使用'&amp;'你会评估所有的功能。对于实例

case 5: i = p1() & p2() & p3() & p4() & p5(); break;

如果p2()返回false,i仍然是假的,但p3,p4和p5将被贬值(可能不是您想要的)。 如果您不希望进行额外评估,请使用短路操作符 - &&

答案 5 :(得分:0)

var areAllTrue = p1() && p2() && ... && p7();
return areAllTrue;

仅当每个p *()返回true时,这将评估为真。