如果我有一个嵌套在另一个循环中的for循环,我如何才能以最快的方式有效地从两个循环(内部和外部)中出来?
我不想必须使用布尔值然后必须说转到另一个方法,而只是在外部循环之后执行第一行代码。
有什么又快又好的方法呢?
我在想异常并不便宜/只应该在真正异常的情况下抛出等等。因此,从性能的角度来看,我不认为这个解决方案是好的。
我不认为利用。net中的新特性(anon方法)来做一些非常基础的事情是正确的。
如果我有一个嵌套在另一个循环中的for循环,我如何才能以最快的方式有效地从两个循环(内部和外部)中出来?
我不想必须使用布尔值然后必须说转到另一个方法,而只是在外部循环之后执行第一行代码。
有什么又快又好的方法呢?
我在想异常并不便宜/只应该在真正异常的情况下抛出等等。因此,从性能的角度来看,我不认为这个解决方案是好的。
我不认为利用。net中的新特性(anon方法)来做一些非常基础的事情是正确的。
当前回答
有时候,将代码抽象到它自己的函数中,而不是使用早期返回(早期返回是邪恶的:)
public void GetIndexOf(Transform transform, out int outX, out int outY)
{
outX = -1;
outY = -1;
for (int x = 0; x < Columns.Length; x++)
{
var column = Columns[x];
for (int y = 0; y < column.Transforms.Length; y++)
{
if(column.Transforms[y] == transform)
{
outX = x;
outY = y;
return;
}
}
}
}
其他回答
在外环使用合适的防护。在你破坏之前,在内环设置保护。
bool exitedInner = false;
for (int i = 0; i < N && !exitedInner; ++i) {
.... some outer loop stuff
for (int j = 0; j < M; ++j) {
if (sometest) {
exitedInner = true;
break;
}
}
if (!exitedInner) {
... more outer loop stuff
}
}
或者更好的是,将内部循环抽象为一个方法,并在外部循环返回false时退出外部循环。
for (int i = 0; i < N; ++i) {
.... some outer loop stuff
if (!doInner(i, N, M)) {
break;
}
... more outer loop stuff
}
bool breakInnerLoop=false
for(int i=0;i<=10;i++)
{
for(int J=0;i<=10;i++)
{
if(i<=j)
{
breakInnerLoop=true;
break;
}
}
if(breakInnerLoop)
{
continue
}
}
是否有可能将嵌套的for循环重构为私有方法?这样你就可以简单地从方法中“返回”以退出循环。
c#自适应的方法经常在C中使用——设置外循环的变量值的循环外条件(即对于循环使用int变量INT_MAX -1通常是很好的选择):
for (int i = 0; i < 100; i++)
{
for (int j = 0; j < 100; j++)
{
if (exit_condition)
{
// cause the outer loop to break:
// use i = INT_MAX - 1; otherwise i++ == INT_MIN < 100 and loop will continue
i = int.MaxValue - 1;
Console.WriteLine("Hi");
// break the inner loop
break;
}
}
// if you have code in outer loop it will execute after break from inner loop
}
正如代码中的注释所说,break不会神奇地跳转到外循环的下一个迭代-所以如果你的代码在内循环之外,这种方法需要更多的检查。在这种情况下考虑其他解决方案。
这种方法适用于for和while循环,但不适用于foreach。在foreach的情况下,你不会有代码访问隐藏的枚举器,所以你不能改变它(即使你可以IEnumerator没有一些“MoveToEnd”方法)。
内联评论的作者致谢: i = INT_MAX - 1的建议由Meta 对于ygoe的评论。 适当的IntMax由jmbpiano 对内循环后代码的注释
考虑到函数/方法并使用早期返回,或将循环重新安排为while子句。Goto /exceptions/无论什么在这里肯定不合适。
def do_until_equal():
foreach a:
foreach b:
if a==b: return