【问题标题】:Check severeal boolean returns in same time同时检查多个布尔返回
【发布时间】:2013-12-19 07:48:04
【问题描述】:

我有几个 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 ..

【问题讨论】:

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


    【解决方案1】:

    使用&&(逻辑与)而不是&(二元运算符)

    喜欢:

    p1() && p2();

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

    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 条目是否与 &amp;&amp; 的 switch case 相同

    【讨论】:

    • 结果是一样的。只是表达式的计算量不同。
    • @MarceloCantos 是的,这是真的,但我没有提到结果会有所不同,我说OP应该在这里使用&amp;&amp;而不是&amp;
    • 当然,但是通过声明&amp;&amp;“只有当所有p*() 都为真时才会返回真”,你给读者留下的印象是&amp; 做了别的事情。
    • @MarceloCantos 好的,这可能会令人困惑,我会更改它,谢谢
    【解决方案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 ???
    

    【讨论】:

    • 你可以在这里使用ps.Take(idcount).All(x=&gt;x());而不是聚合
    • @wudzik 太棒了,它让我因为使用​​聚合逻辑而蒙蔽了双眼,借用你的评论来编辑我的答案。
    【解决方案3】:

    使用& bit wise operator 将导致计算所有表达式,即使您在第一个p1() 中获得false。您应该使用&& logical operator 来组合条件。

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

    条件与运算符 (&&) 对其布尔操作数执行逻辑与,但仅在必要时评估其第二个操作数 MSDN。

    【讨论】:

      【解决方案4】:

      您应该使用&amp;&amp;,它是逻辑(真/假)值的运算符。

      i = p1() && p2();
      

      &amp; 是数字的按位与运算符。

      【讨论】:

        【解决方案5】:

        考虑到你所说的不变量

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

        你的代码是正确的。

        通过使用“&”,您将评估所有函数。例如

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

        如果p2() 返回 false,i 仍然为 false,但 p3、p4 和 p5 将被评估(这可能不是您想要的)。 如果您不想进行额外的评估,请改用短路运算符 - &amp;&amp;。

        【讨论】:

          【解决方案6】:
          var areAllTrue = p1() && p2() && ... && p7();
          return areAllTrue;
          

          只有当每个 p*() 都返回 true 时,才会评估为 true。

          【讨论】:

            猜你喜欢
            • 2022-07-13
            • 1970-01-01
            • 2013-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-14
            相关资源
            最近更新 更多