我想知道如何检查if语句的哪一部分是正确的。例如,如果你有这个:
int a = 1, b, c, d;
if(a > 0 || b > 1 || c > 2 || d > 3)
{
//do stuff
}
现在,在这种情况下,使if为正确的是a
。那你怎么验证呢?
基本上你可以把它们放在4个不同的if中,但是如果你必须为每一个做一个重复的代码,你可能会想出一些方法,但实际上并没有传递某些值的方法吗?
答案 0 :(得分:8)
在您不仅需要知道整体结果而且还需要知道结果true
的项目的情况下,一种方法是将条件放入数组,并执行OR链{{1}自己:
||
请注意,此方法与var conditions = new[] {a > 0, b > 1, c > 2, d > 3};
var whichOne = Array.IndexOf(conditions, true);
if (whichOne >= 0) {
Console.WriteLine("Condition number {0} is true", whichOne);
} else {
Console.WriteLine("The condition is false");
}
链不同,因为它不会短路评估。换句话说,在调用||
之前将评估所有四个条件。
答案 1 :(得分:1)
在C#中没有直接的方法来实现这一目标。它在if中进行了评估,然后结果基本上就被抛弃了。
您可以再次运行测试:
int a = 1, b, c, d;
if(a > 0 || b > 1 || c > 2 || d > 3)
{
if(a > 0)
{
// do special stuff
}
//do stuff
}
或者如果价格昂贵,请单独存储:
int a = 1, b, c, d;
bool aOverZero = a > 0;
if(aOverZero || b > 1 || c > 2 || d > 3)
{
if(aOverZero)
{
// do special stuff
}
//do stuff
}
或者只是对重复的代码使用另一种方法:
int a = 1, b, c, d;
if(a > 0)
{
// do special stuff
doStuff();
}
else if (b > 1)
{
// do special stuff
doStuff();
}
您选择的只取决于您的代码是什么,运行测试的成本以及使其最具可读性的因素。在这种情况下,明显夸大它的简单性,可读性将成为首要考虑因素。我可能默认为第一个。在范围内引入整个其他变量可能是不值得的。
答案 2 :(得分:-1)
处理此问题的最佳方法是refactor the conditional to a polymorphic object(better example)。您将doStuff()
重构为父对象,然后为每个变量赋予自己的对象。您在对象上调用doStuff()
,它会完全删除条件。您的对象将根据您正在测试的变量的值进行实例化。这样做的主要好处是,您可以实现doStuff()
一次,让每个子对象在调用super()
之前执行您需要做的任何特殊行为。