同时检查多个布尔返回

Posted

技术标签:

【中文标题】同时检查多个布尔返回【英文标题】: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 ..

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于同时检查多个布尔返回的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 返回多个值

检查参考参数值还是返回布尔值?

Python:如何检查列表是不是包含数值并返回布尔值?

检查两个值是不是存在并返回命名布尔值

检查整数是不是为 0 并返回布尔值的简短方法

检查数据库中是不是存在行,并返回布尔值