看搜索结果里头几个爆栈站的回答就够了。
简单来说C#没有Java能给循环打label的语法,所以没有直接对应的办法。
解决方案有三个流派:
bool flag = false; for (...) { for (...) { if (...) { flag = true; break; } } if (flag) break; }
还有更变态的用抛/接异常来做的…滥用异常实现控制流派。这是异端,好孩子不要学,所以不列在“三个流派”中。不过我们也不能教条的批判它,也得看看它有趣的一面,例如:
Unchecked Exceptions Can Be Strictly More Powerful Than Call/CC- MSDN
The goto statement transfers the program control directly to a labeled statement.
A common use of goto is to transfer control to a specific switch-case label or the default label in a switch statement.
The goto statement is also useful to get out of deeply nested loops.
C#规范说:
A label can be referenced from goto statements within the scope of the label. [Note: This means that goto statements can transfer control within blocks and out of blocks, but never into blocks. end note]
The target of a goto identifier statement is the labeled statement with the given label. If a label with the given name does not exist in the current function member, or if the goto statement is not within the scope of the label, a compile-time error occurs. [Note: This rule permits the use of a goto statement to transfer control out of a nested scope, but not into a nested scope. In the examplea goto statement is used to transfer control out of a nested scope. end note]using System; class Test { static void Main(string[] args) { string[,] table = { {"red", "blue", "green"}, {"Monday", "Wednesday", "Friday"} }; foreach (string str in args) { int row, colm; for (row = 0; row <= 1; ++row) for (colm = 0; colm <= 2; ++colm) if (str == table[row,colm]) goto done; Console.WriteLine("{0} not found", str); continue; done: Console.WriteLine("Found {0} at [{1}][{2}]", str, row, colm); } } }