如何通过速记“if-else”结果打破循环?

时间:2013-04-04 15:40:33

标签: c# loops if-statement break shorthand

假设我在循环中有一个简写的if-else语句,如下例所示:

for(...)
{
    a = b == c ? b : c;
    // More unnecessary code if the result was true.
}

我想根据条件的结果打破循环:

for(...)
{
    a = b == c ? b break : c;
    // Now the unnecessary code is not executed.
}

我意识到我可以像在这个例子中那样完整地输入它:

for(...)
{
    if( b == c )
    {
        a = b;
        break;
    }
    else
    {
        a = c;
    }
    // Now the unnecessary code is not executed.
}

但它太长了,我试图将每一个破坏条件放在一行,因为它们有几个。

6 个答案:

答案 0 :(得分:5)

您可以在不使用三元运算符的情况下使用缩短的语法,但您尝试做的事情是不可能的。如果else中有break声明,您也不需要if

for (...)
{
    if (b == c) { a = b; break; }

    a = c;
    // More code if b does not equal c
}

答案 1 :(得分:2)

对于您给出的示例,您可以对其进行重组,以便

for (int i = 0; i < count && b != c; ++i)
{
    if( b != c )
    {
        // code
    }
}
a = b;

但是,您尝试做的具体事情(从三元内部突破)是不可能的。

答案 2 :(得分:2)

以下是关于三元运算符及其用途的一些信息:?: Operator (C#)

你想要做的事情是不可能的......这不是它的运作方式。

答案 3 :(得分:1)

三元运算符(“简写if-else”)仅用于根据布尔值计算两个语句中的一个。它不是像if那样的流量控制结构;它实际上返回它执行的语句的结果。你不能用它来执行这样的代码。

如果您最终选择了一个很长的else-if-else-if链,请考虑重构一下。可以用switch块替换它。

答案 4 :(得分:1)

为测试制作功能。如果它被重用,它至少比你的例子短。

int a;
if(TryEqual(b, c, out a))
    break;

bool TryEqual(int x, int y, out res)
{
    if(x == y)
    {
        res = x;
        return true;
    }
    res = y;
    return false;
}

答案 5 :(得分:0)

我提出了这个解决方案。

for (...)
{
  if ( (b == c ? (a=b) == a : (a=c) != a) ) break;
}

当然精明的读者会注意到你总是分配a=c,然后当且仅当b==c等同时才会中断。

for (...)
{
  a = c; if (b==c) break;
}

即使仍然保持那些讨厌的if-else结构合并为一行,也是如此简短和优雅。