我有几个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 ..
答案 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
条目是否与&&
答案 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时,这将评估为真。