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

问题描述 投票:3回答:6

假设在这种情况下,我在循环中有一个简写的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.
}

但是时间太长,由于其中有多个中断条件,因此我试图将所有中断条件放在一行中。

c# loops if-statement break shorthand
6个回答
2
投票

以下是有关三元运算符的一些信息,它的用法是:?: Operator (C#)

您想做的事是不可能的……这不是它的工作方式。


5
投票

您可以在不利用三元运算符的情况下使用缩短的语法,但是您尝试执行的操作是不可能的。如果?: Operator (C#)中有else语句,则也不需要break

if

2
投票

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

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

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

但是,您要尝试执行的特定操作(在三元内部中断)是不可能的。


1
投票

三元运算符(即“简写if-else”)仅用于基于布尔值评估两个语句之一。它不是像for (int i = 0; i < count && b != c; ++i) { if( b != c ) { // code } } a = b; 那样的流控制结构;它实际上返回执行语句的结果。您不能使用它来执行类似的代码。

如果您要得到一条长的else-if-else-if链,请考虑进行一些重构。可以将其替换为if块。


1
投票

为测试提供功能。如果被重用,它至少比您的示例短。

switch

0
投票

我想出了这个解决方案。

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;
}

当然,精明的读者会注意到,您可以总是分配for (...) { if ( (b == c ? (a=b) == a : (a=c) != a) ) break; } ,然后在且仅当a=c等同时才中断。

b==c

这将要变得简短而优雅,同时仍将那些讨厌的if-else构造合并为一行。

© www.soinside.com 2019 - 2024. All rights reserved.