c#我可以为“if”这样做吗?或任何其他方式做这样的事情?

时间:2011-12-01 02:21:05

标签: c#

if ((((a > 0) && ((b > 0) || (c> 0) || (d> 0) || (e> 0))) ||
((a1 > 0) && ((b> 0) || (c > 0) || (d > 0) || (e> 0))) ||
((a2 > 0) && ((b> 0) || (c> 0) || (d> 0) || (e> 0))) ||
((a3> 0) && ((b> 0) || c> 0) || (d> 0) || (e> 0)))) && 
((75.5 > d1 && d1 > 74.5) || (75.5 > d2 && d2 > 74.5)))
{
    //do something
}

只想使IF的条件如下:

(a> 0且(b> 0或c> 0或d> 0或e> 0))和((d1 <75.5且d1> 74.5)或(d2 <75.5且d2> 74.5)) 要么 (a1> 0且(b> 0或c> 0或d> 0或e> 0))和((d1 <75.5且d1> 74.5)或(d2 <75.5且d2> 74.5)) 要么 (a2> 0且(b> 0或c> 0或d> 0或e> 0))和((d1 <75.5且d1> 74.5)或(d2 <75.5且d2> 74.5)) 要么 (a3> 0且(b> 0或c> 0或d> 0或e> 0))和((d1 <75.5且d1> 74.5)或(d2 <75.5且d2> 74.5))

对于a1到a3的相同条件

我在这些代码之前创建了一个for循环来进行一些检查,那些a,a1,a2,a3,b,c,d,e是在for循环中在某些特殊条件下加1的整数,我只是想在这个if()中做一些进一步的分组,并且想知道这个多“Ands”和“Ors”是否有效

3 个答案:

答案 0 :(得分:3)

我会把它分解成更多的布尔值以简化它

bool biggerZero = (b > 0) || (c> 0) || (d> 0) || (e> 0));
bool anAzero = a > 0 || a1 > 0 || a2 > 0 || a3 > 0;
bool d1range = 75.5 > d1 && d1 > 74.5;
bool d2range = 75.5 > d2 && d2 > 74.5;
bool solution = anAzero && biggerZero && (d1range || d2range);

答案 1 :(得分:1)

通常,当在复杂表达式中重复使用公共子表达式时,将它们放在单独的变量中会更加清晰。在优化方面,这对编译器没有任何影响。

你的括号不均衡,所以我不能100%确定你的代码在表达什么,但是例如你可以声明

bool aThroughEGreaterEqualZero = (b > 0) || (c> 0) || (d> 0) || (e> 0);

并在if

中使用该代替所有评估结果

为了让下一个人维护代码,我会将if语句中的表达式分解为许多有意义的变量,然后在实际{{1}中使用这些变量}。

答案 2 :(得分:0)

您可以创建一个辅助方法来检查重复代码,如:

Func<bool> conditionExpression => (int a, int b, int c, int d, int e) =>
{
    return a > 0 && (b | c |d | e) > 0;
}
bool dWithinRange = (d1 < 75.5 && d1 > 74.5 ) || (d2 < 75.5 and d2 > 74.5);

if (conditionExpression(a, b, c, d, e) &&
    conditionExpression(a1, b1, c1, d1, e1) &&
    conditionExpression(a2, b2, c2, d2, e2) &&
    conditionExpression(a3, b3, c3, d3, e3) &&
    dWithinRange
{
    // finally
}
然而,我错过了最有帮助的修改,那就是为变量提供可理解的名称。您的代码读者不太可能理解d1是什么以及为什么它必须小于...