继续嵌套while循环

在这个代码示例中,是否有任何方法继续从catch块外循环?

while { // outer loop while { // inner loop try { throw; } catch { // how do I continue on the outer loop from here? continue; } } } 

更新:这个问题是我关于这个问题的文章的灵感。 感谢您的好问题!


“继续”和“rest”只不过是一个“goto”的愉快语法。 显然,通过给予他们可爱的名字,并将他们的用法限制在特定的控制结构中,他们不再为“所有的gotos都是坏的”人群而愤怒。

如果你想要做的是一个继续到外部,你可以简单地在外部循环的顶部定义一个标签,然后“转到”该标签。 如果你觉得这样做并不妨碍代码的可理解性,那么这可能是最有利的解决scheme。

不过,我会以此为契机,考虑一下您的控制stream是否会从一些重构中受益。 每当我在嵌套循环中有条件的“rest”和“继续”,我认为重构。

考虑:

 successfulCandidate = null; foreach(var candidate in candidates) { foreach(var criterion in criteria) { if (!candidate.Meets(criterion)) // Edited. { // TODO: no point in continuing checking criteria. // TODO: Somehow "continue" outer loop to check next candidate } } successfulCandidate = candidate; break; } if (successfulCandidate != null) // do something 

两个重构技术:

首先,将内部循环提取到一个方法:

 foreach(var candidate in candidates) { if (MeetsCriteria(candidate, criteria)) { successfulCandidate = candidate; break; } } 

其次, 所有的循环都可以消除吗? 如果你正在循环,因为你正在尝试search的东西,然后重构成一个查询。

 var results = from candidate in candidates where criteria.All(criterion=>candidate.Meets(criterion)) select candidate; var successfulCandidate = results.FirstOrDefault(); if (successfulCandidate != null) { do something with the candidate } 

如果没有循环,那么就没有必要打破或继续!

  while { // outer loop while { // inner loop try { throw; } catch { // how do I continue on the outer loop from here? goto REPEAT; } } // end of outer loop REPEAT: // some statement or ; } 

问题解决了。 (什么?你们为什么都给我那脏兮兮的表情?)

你可以rest一下; 声明。

 while { while { try { throw; } catch { break; } } } 

继续用于跳回当前循环的顶部。

如果你需要打破更多的水平,你将不得不添加某种'如果'或使用可怕/不推荐'转到'。

使用inner while循环交换try / catch结构:

 while { try { while { throw; } } catch { continue; } } 

没有。
我build议,将内部循环解压为一个单独的方法。

 while { // outer loop try { myMethodWithWhileLoopThatThrowsException() } catch { // how do I continue on the outer loop from here? continue; } } } 

在内部循环中使用break

你只是想从内在将继续在外面打破。

 while { // outer loop while { // inner loop try { throw; } catch { // how do I continue on the outer loop from here? break; } } } 

我认为完成这个最好的方法是使用break语句。 中断结束当前循环从结束处继续执行 。 在这种情况下,它将结束内部循环跳回到while循环中 。 这就是你的代码的样子:

 while { // outer loop while { // inner loop try { throw; } catch { // break jumps to outer loop, ends inner loop immediately. break; //THIS IS THE BREAK } } } 

我相信那是你想要成就的,对吗? 谢谢!

 using System; namespace Examples { public class Continue : Exception { } public class Break : Exception { } public class NestedLoop { static public void ContinueOnParentLoopLevel() { while(true) try { // outer loop while(true) { // inner loop try { throw new Exception("Bali mu mamata"); } catch (Exception) { // how do I continue on the outer loop from here? throw new Continue(); } } } catch (Continue) { continue; } } } } } 

使用自己的exceptiontypes,例如MyException。 然后:

 while { try { // outer loop while { // inner loop try { throw; } catch { // how do I continue on the outer loop from here? throw MyException; } } } catch(MyException) { ; } } 

这将继续和爆发几个层次的嵌套while语句。 抱歉格式不正确;)