当我有嵌套循环时,有人能告诉我如何打破主循环吗? 实施例*:
/*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;它将是有效的),但是我能在这做什么?
谢谢你的建议!
答案 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查询的结果执行操作。从而删除嵌套循环并替换为一个循环。