同时检查多个布尔返回
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
条目是否与 &&
的 switch case 相同
【讨论】:
结果是一样的。只是表达式的计算量不同。 @MarceloCantos 是的,这是真的,但我没有提到结果会有所不同,我说OP应该在这里使用&&
而不是&
当然,但是通过声明&&
“只有当所有p*()
都为真时才会返回真”,你给读者留下的印象是&
做了别的事情。
@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=>x());
而不是聚合
@wudzik 太棒了,它让我因为使用聚合逻辑而蒙蔽了双眼,借用你的评论来编辑我的答案。【参考方案3】:
使用& bit wise operator 将导致计算所有表达式,即使您在第一个p1()
中获得false
。您应该使用&& logical operator 来组合条件。
二进制 & 运算符 是为整数类型和 bool 预定义的。对于整数类型, & 计算其操作数的逻辑按位与。对于 bool 操作数, & 计算其操作数的逻辑与;也就是说,当且仅当它的两个操作数都为真时,结果才为真。 & 运算符计算两个运算符,而不考虑第一个运算符的值 MSDN。
条件与运算符 (&&) 对其布尔操作数执行逻辑与,但仅在必要时评估其第二个操作数 MSDN。
【讨论】:
【参考方案4】:您应该使用&&
,它是逻辑(真/假)值的运算符。
i = p1() && p2();
&
是数字的按位与运算符。
【讨论】:
【参考方案5】:考虑到你所说的不变量
如果 p*() 之一在任何情况下返回 false,我想要返回 false。是正确的方式还是两个假返回真?我希望所有 p*() 都返回 true 我返回 true ..
你的代码是正确的。
通过使用“&”,您将评估所有函数。例如
case 5: i = p1() & p2() & p3() & p4() & p5(); break;
如果p2()
返回 false,i
仍然为 false,但 p3、p4 和 p5 将被评估(这可能不是您想要的)。
如果您不想进行额外的评估,请改用短路运算符 - &&
。
【讨论】:
【参考方案6】:var areAllTrue = p1() && p2() && ... && p7();
return areAllTrue;
只有当每个 p*() 都返回 true 时,才会评估为 true。
【讨论】:
以上是关于同时检查多个布尔返回的主要内容,如果未能解决你的问题,请参考以下文章