打破嵌套循环

时间:2011-12-13 22:39:36

标签: c# .net nested-loops labels

当我有嵌套循环时,有人能告诉我如何打破主循环吗? 实施例*:

/*Main loop*/
for(int y = 0; y < 100; y+=10)
{
    /*Sub loop*/
    for (int x = 0; x < 100; x += 10)
    {
        if(x == 60) 
        { 
            //Break the main loop 
        }
    }
}

*此代码不执行任何操作,它只是一个示例

我应该把它放在&#34; Break主循环的位置&#34;评论?在java中有标签,我可以打破(当我将标签设置为主循环名为&#34; MainLoop&#34;我可以写&#34;打破MainLoop;&#34;它将是有效的),但是我能在这做什么?

谢谢你的建议!

13 个答案:

答案 0 :(得分:17)

goto

我无法理解这种持续的模因,即goto被认为是“有害的”。如果使用得当,它非常强大,就是这种情况。

答案 1 :(得分:10)

  • 重构,因此您不需要以这种方式退出嵌套循环 通常可以通过将循环放入单独的函数来使用return
  • 使用goto
  • 使用旗帜(丑陋)

答案 2 :(得分:7)

使用标志来表示终止:

for(int y = 0; y < 100; y+=10)
{
     bool flag = false;
     for(int x = 0; x < 100; x += 10)
     {
        if (x == 56)
        {
           flag = true;
           break;
        }
     }

     if(flag) break;
}

答案 3 :(得分:5)

有些人会因为建议使用goto语句而向我发起攻击,但是打破多个循环是其中一个非常有用(且高效)的地方:

/*Main loop*/
for(int y = 0; y < 100; y+=10)
{
    /*Sub loop*/
    for (int x = 0; x < 100; x += 10)
    {
        if(x == 56) 
        { 
            goto MainLoopDone;
        }
    }
}

MainLoopDone:
// carry on here

答案 4 :(得分:3)

通常最好把它放到一个单独的函数中,然后执行'return'

void loop_de_loop()
{
  for(int y = 0; y < 100; y+=10)
  {
      /*Sub loop*/
      for (int x = 0; x < 100; x += 10)
      {
          if(x == 56) 
          { 
              return;
          }
      }
  }
}

答案 5 :(得分:2)

我不知道是否有办法摆脱C#中的嵌套循环,但允许我建议一种解决方法。

您可以将主循环抛出一个函数并返回该函数。您可return false;表示过早休息,return true;表示循环已经完成,如果这很重要。

答案 6 :(得分:2)

评论中建议的标志可能是最好的方法:

boolean someFlag = true;

for(int y = 0; i < 100 && someFlag; y += 10) {
  for(int x = 0; x < 100 && somFlag; x += 10) {
    if(x == 56)
      someFlag = false;
  }
}

答案 7 :(得分:0)

/*Main loop*/
for(int y = 0; y < 100; y+=10)
{
    bool makeMeBreak = false;

    /*Sub loop*/
    for (int x = 0; x < 100; x += 10)
    {
        if(x == 56) 
        { 

            //Break the main loop 
            makeMeBreak = true;
            break;
        }
    }
    if (makeMeBreak) break;
}

答案 8 :(得分:0)

没有好的通用答案。 “正确的方式”取决于真正的问题。最好的方法可能是将外部循环放在一个函数中,然后使用return;来突破它。它可能是x=100; y=100;。它可能是done=true;。哎呀,甚至可能是goto(开玩笑)。

答案 9 :(得分:0)

不建议但您可以使用goto。请参阅this

public class GotoTest1
{
    static void Main()
    {
        int x = 200, y = 4;
        int count = 0;
        string[,] array = new string[x, y];

        // Initialize the array:
        for (int i = 0; i < x; i++)

            for (int j = 0; j < y; j++)
                array[i, j] = (++count).ToString();

        // Read input:
        Console.Write("Enter the number to search for: ");

        // Input a string:
        string myNumber = Console.ReadLine();

        // Search:
        for (int i = 0; i < x; i++)
        {
            for (int j = 0; j < y; j++)
            {
                if (array[i, j].Equals(myNumber))
                {
                    goto Found;
                }
            }
        }

        Console.WriteLine("The number {0} was not found.", myNumber);
        goto Finish;

    Found:
        Console.WriteLine("The number {0} is found.", myNumber);

    Finish:
        Console.WriteLine("End of search.");


        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/*
Sample Input: 44

Sample Output
Enter the number to search for: 44
The number 44 is found.
End of search.
*/

不建议,因为它使流程更难理解。其他选项当然是在内循环中设置一些标志并在外循环中检查它,我打了折扣,因为它很明显并假设你知道它反正.. :)

答案 10 :(得分:0)

正如您所提到的那样,break命令上没有标签,您可以这样做:

/*Main loop*/
bool fFound;
for(int y = 0; y < 100 && !fFound; y+=10)
{
    /*Sub loop*/
    for (int x = 0; x < 100; x += 10)
    {
        if(x == 56) 
        { 
            //Break the main loop 
            fFound = true;
            break; //Break inner loop
        }
    }
}

答案 11 :(得分:0)

正如其他人所说,“正确”的答案取决于你正在解决的问题。如果可以的话,将它分成小块是首选路线。这个模型的一些东西:

object MainLoop ()
{
    object result = null;
    for(int y = 0; y < 100; y+=10)
    {
        result = SubLoop(y);
        if (result != null)
        {
            break;
        }
    }
    return result;
}

object SubLoop (int y)
{
    object result = null;
    for (int x = 0; x < 100; x += 10)
    {
        if(x == 56)
        {
            result = objectInstance;
            break;
        }
    }
    return result;
}

在我看来,从一个函数中获得多个return语句,使用额外的标志或( shudder )使用goto是不同程度的丑陋。但是,有时其中一个是必要的。

编辑:这证​​明使用此方法返回某种有用的对象,您将拥有“Customer”或“IDataAccess”或“bool”或“object”以外的其他内容作为返回类型,如果将其用于实际。

答案 12 :(得分:0)

我首先使用LINQ收集有趣的对象,然后对LINQ查询的结果执行操作。从而删除嵌套循环并替换为一个循环。