Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “如何用速记打破循环”;如有其他",;结果如何?_C#_Loops_If Statement_Break_Shorthand - Fatal编程技术网

C# “如何用速记打破循环”;如有其他",;结果如何?

C# “如何用速记打破循环”;如有其他",;结果如何?,c#,loops,if-statement,break,shorthand,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. } 我意识到我可以像下面这个例子那样完整地输

假设循环中有一个简化的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.
}

但是它太长了,我试图把每一个中断条件都放在一行中,因为有几个中断条件。

你可以使用一个缩短的语法,而不使用三元运算符,但是你试图做的是不可能的。如果在
if
中有
break
语句,也不需要
else

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

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

对于您给出的示例,您可以将其重新构造为

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

但是,您尝试执行的特定操作(从三元运算符中断开)是不可能的。

以下是有关三元运算符及其用法的一些信息:

你想做的是不可能的。。。这不是它的工作原理。

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


<>如果你结束了一个漫长的,如果是链,考虑重构。可以将其更换为
开关
块。

为测试创建一个功能。如果它被重用,它至少比您的示例要短

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
时中断,因为这是等效的

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

这是一个非常简短和优雅的设计,同时仍然将那些令人讨厌的if-else结构合并成一行。

这是不可能的。+这是一种非常丑陋的方式。你确定你了解编程和面向对象编程的基础知识吗?这与干净的编码风格无关;如果(b==c)中断不幸的是,在三元运算符中,除了它的用途之外,您不能做更多的事情。。。剩下的是另一个“完整”版本。。。我真的不喜欢这种格式化条件块的方式。@anaximander我同意,但似乎把它放在一行对操作很重要。