请教打破嵌套循环

打破嵌套循环

如果我有一个嵌套在另一个中的for循环,我怎么能以最快的方式有效地从两个循环(内部和外部)中出来?

我不想使用布尔值,然后不得不说去另一个方法,而只是在外部循环后执行第一行代码。

这是一个快速而好的方式吗?

谢谢


我认为异常并不便宜/应该只是在一个真正特殊的条件下抛出等等。因此,从性能的角度来看,我认为这种解决方案并不好。

我觉得利用.NET(anon方法)中的新功能做一些非常基本的事情是不对的。

因此,tvon(抱歉不能拼写完整的用户名!)有一个很好的解决方案。

Marc:很好地使用了anon方法,这也很棒但是因为我可以在一个不使用支持anon方法的.NET / C#版本的工作中,我也需要知道一种传统的方法。


小唯快跑啊
浏览 244回答 2
2回答

慕娘9325324

嗯,goto但这很难看,并不总是可能的。您还可以将循环放入方法(或anon-method)并用于return退回到主代码。&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;goto &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;100;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;<&nbsp;100;&nbsp;j++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto&nbsp;Foo;&nbsp;//&nbsp;yeuck! &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}Foo: &nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("Hi");VS://&nbsp;anon-methodAction&nbsp;work&nbsp;=&nbsp;delegate{ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;x&nbsp;=&nbsp;0;&nbsp;x&nbsp;<&nbsp;100;&nbsp;x++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;y&nbsp;=&nbsp;0;&nbsp;y&nbsp;<&nbsp;100;&nbsp;y++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;//&nbsp;exits&nbsp;anon-method &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}};work();&nbsp;//&nbsp;execute&nbsp;anon-methodConsole.WriteLine("Hi");请注意,在C#7中我们应该得到“本地函数”,其中(语法tbd等)意味着它应该工作如下://&nbsp;local&nbsp;function&nbsp;(declared&nbsp;**inside**&nbsp;another&nbsp;method)void&nbsp;Work(){ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;x&nbsp;=&nbsp;0;&nbsp;x&nbsp;<&nbsp;100;&nbsp;x++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;y&nbsp;=&nbsp;0;&nbsp;y&nbsp;<&nbsp;100;&nbsp;y++) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;//&nbsp;exits&nbsp;local&nbsp;function &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}};Work();&nbsp;//&nbsp;execute&nbsp;local&nbsp;functionConsole.WriteLine("Hi");

一只名叫tom的猫

C#自适应方法经常用于C - 外部循环变量的设置值在循环条件之外(即对于循环使用int变量INT_MAX -1通常是不错的选择):for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;100;&nbsp;i++){ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;j&nbsp;=&nbsp;0;&nbsp;j&nbsp;<&nbsp;100;&nbsp;j++) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(exit_condition) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;cause&nbsp;the&nbsp;outer&nbsp;loop&nbsp;to&nbsp;break: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;use&nbsp;i&nbsp;=&nbsp;INT_MAX&nbsp;-&nbsp;1;&nbsp;otherwise&nbsp;i++&nbsp;==&nbsp;INT_MIN&nbsp;<&nbsp;100&nbsp;and&nbsp;loop&nbsp;will&nbsp;continue&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;int.MaxValue&nbsp;-&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("Hi"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;break&nbsp;the&nbsp;inner&nbsp;loop &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;if&nbsp;you&nbsp;have&nbsp;code&nbsp;in&nbsp;outer&nbsp;loop&nbsp;it&nbsp;will&nbsp;execute&nbsp;after&nbsp;break&nbsp;from&nbsp;inner&nbsp;loop&nbsp;&nbsp;&nbsp;&nbsp;}正如代码中的注释所说,break不会神奇地跳转到外循环的下一次迭代 - 所以如果你有内循环之外的代码,这种方法需要更多的检查。在这种情况下考虑其他解决方案这种方法适用于for和while循环,但不起作用foreach。如果foreach你没有代码访问隐藏的枚举器,所以你不能改变它(即使你可能IEnumerator没有一些“MoveToEnd”方法)。对内联评论作者的致谢:&nbsp;Meta的i = INT_MAX - 1建议/&nbsp;ygoe的评论。&nbsp;正确的jmbpiano通过内部循环后约代码备注blizpasta&nbsp;forforeachIntMax&nbsp;
打开App,查看更多内容
随时随地看视频慕课网APP