C#如何检查if语句的哪一部分是正确的

时间:2016-01-08 20:53:48

标签: c# if-statement

我想知道如何检查if语句的哪一部分是正确的。例如,如果你有这个:

int a = 1, b, c, d;
    if(a > 0 || b > 1 || c > 2 || d > 3)
    {
        //do stuff
    }

现在,在这种情况下,使if为正确的是a。那你怎么验证呢? 基本上你可以把它们放在4个不同的if中,但是如果你必须为每一个做一个重复的代码,你可能会想出一些方法,但实际上并没有传递某些值的方法吗?

3 个答案:

答案 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 objectbetter example)。您将doStuff()重构为父对象,然后为每个变量赋予自己的对象。您在对象上调用doStuff(),它会完全删除条件。您的对象将根据您正在测试的变量的值进行实例化。这样做的主要好处是,您可以实现doStuff()一次,让每个子对象在调用super()之前执行您需要做的任何特殊行为。