C# 如何在c中从第二个嵌套的foreach循环中断第一个foreach循环#

C# 如何在c中从第二个嵌套的foreach循环中断第一个foreach循环#,c#,C#,如何从c#中嵌套的每个循环的第二个循环中先断开每个循环的第一个循环,我想检查第二个循环中每个循环的一些条件,然后尝试断开每个循环的父循环 foreach(//do some stuff) { foreach(//do some stuff) { if(//check some condition) { break;//but want to break first foreach loop

如何从c#中嵌套的每个循环的第二个循环中先断开每个循环的第一个循环,我想检查第二个循环中每个循环的一些条件,然后尝试断开每个循环的父循环

foreach(//do some stuff)
{
     foreach(//do some stuff)
     {
          if(//check some condition)
          {
                break;//but want to break first foreach loop
          }
     }
}

快速回答:

foreach(//do some stuff)
{
     foreach(//do some stuff)
     {
          if(//check some condition)
          {
                goto end; // I'd probably add a comment here
          }
     }
     // *1
}
end:
{} // the rest of your code.
但是,但是

SESE违规行为违反了单进单出原则。通过使用额外的条件,很容易修复:

bool found = false;
for (int i=0; i<foo.Count && !found; ++i)
{
    for (int j=0; j<bar.Count; ++j) 
    {
        if (...) { found = true; }
    }
    // *1 
    if (!found) { ... }
}
boolfound=false;
对于(inti=0;i
booldobreak=false;
foreach(//做一些事情)
{
foreach(//做一些事情)
{
多布雷克=;
如果(多布雷克)断裂;
}
如果(多布雷克)断裂;
}

您可以通过使用“标志”来实现

bool breakout = false
foreach(//do some stuff)
{
     foreach(//do some stuff)
     {
          if(//check some condition)
          {
             breakout = true;
             break;
          }
     }
     if(breakout)
      break;
}

您可以尝试像这样使用
return

foreach(//do some stuff)
    foreach(//do some stuff)
       if(//check some condition)
          return;

您可以在使用的同时使用。也许这段代码对您有所帮助

foreach(// Some condition here)
{
    //solution
    bool breakme = false;

    while (// Some condition here)
    {
        foreach (// Some condition here)
        {
            if (// Condition again)
            {
                //Do some code
            }
            if (// Condition again)
            {
                //Stop the first foreach then go back to first foreach
                breakme = true;
                break;
            }
        }
    }
    if(breakme)
    {
        break;
    }
}

如果您不能
返回
,我建议使用Linq,它可以使您的代码可读:


@鲁弗:偶尔,你会让自己使用
goto
,尤其是当你不能将
return
。@Loofer循环被编译成IL-goto循环和LABEL循环。只是如果你有其他选择,就不要养成习惯。@DmitryBychenko没错。如果你想使用goto-IMHO,使用标志没有什么意义。添加了一些解释关于那件事"程序员浪费大量时间考虑或担心其程序中非关键部分的速度,而在考虑调试和维护时,这些提高效率的尝试实际上会产生强烈的负面影响。我们应该忘记效率低的问题,比如说97%的时间:过早优化是最重要的但我们不应该在这关键的3%上放弃我们的机会。我想,旁观者眼中的“可读性”是可以理解的虽然这可能有助于OP的目的,
return
不仅仅是中断循环-它中断了包含循环的函数!公平地说,OP没有提到这些循环是返回它们循环得到的值的函数的一部分。
foreach(// Some condition here)
{
    //solution
    bool breakme = false;

    while (// Some condition here)
    {
        foreach (// Some condition here)
        {
            if (// Condition again)
            {
                //Do some code
            }
            if (// Condition again)
            {
                //Stop the first foreach then go back to first foreach
                breakme = true;
                break;
            }
        }
    }
    if(breakme)
    {
        break;
    }
}
Boolean found = false;

foreach(var item1 in source1.TakeWhile(_ => !found)) {
     foreach(var item2 in source2.TakeWhile(_ => !found)) {
          if (some condition)
          {
               found = true;

               //break; // Not necessary
          }
     }
}