HOWTO · Csharp
在 C# 中退出 Foreach 循环
在本指南中,我们将学习如何在 C# 中退出 foreach 循环。
本页内容
当满足条件时,要停止 C# foreach 循环,请使用 break。它会结束最近的外层循环,并继续执行该循环之后的第一条语句。如果还要结束当前方法,请使用 return。对于嵌套循环,可以用标志将条件从内层循环传递出来,然后结束外层循环。
使用 break 退出循环
此示例在列表中查找值 4。检查条件的代码位于打印语句之前,因此循环不会处理匹配的值及其后续项。示例会打印 4 之前的各个值,然后继续执行循环之后的语句。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
foreach (int number in numbers)
{
if (number == 4)
{
break;
}
Console.WriteLine(number);
}
Console.WriteLine("Loop finished");
}
}
1
2
3
Loop finished
break 只会退出最近的外层循环。随后,程序会执行循环之后的 Console.WriteLine("Loop finished")。在 foreach 中,迭代对象是可枚举序列;此示例使用 List<int>。如果要跳过匹配项的处理,请将条件判断放在相关操作之前。如果放在操作之后,该项就会先被处理,然后循环才会停止。
return 会退出当前方法
如果满足条件时应该停止执行该方法剩余的所有工作,请选择 return。此示例会打印 4 之前的各个值,然后返回到 Main。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
PrintBeforeFour(new List<int> { 1, 2, 3, 4, 5, 6 });
Console.WriteLine("Back in Main");
}
static void PrintBeforeFour(List<int> numbers)
{
foreach (int number in numbers)
{
if (number == 4)
{
return;
}
Console.WriteLine(number);
}
Console.WriteLine("Method finished after the loop");
}
}
1
2
3
Back in Main
在 PrintBeforeFour 中执行 return 时,控制权会返回调用方,因此该方法后续的语句会被跳过。随后,Main 会从调用语句之后继续执行。这与 break 不同:break 会退出循环,但仍在同一方法中继续执行。对于有返回值的方法,每条执行路径都必须提供声明返回类型对应的值;void 方法则可以使用不带值的 return。
使用标志处理嵌套循环的退出条件
内层循环中的 break 只会退出该内层循环。如果在内层循环中找到匹配项后还要停止外层 foreach,请用标志记录这一情况,并在内层循环结束后检查标志。此示例会打印各个值,直到 4,然后停止两个循环。
using System;
class Program
{
static void Main()
{
int[][] rows =
{
new[] { 1, 2 },
new[] { 3, 4 },
new[] { 5, 6 }
};
bool found = false;
foreach (int[] row in rows)
{
foreach (int value in row)
{
Console.WriteLine(value);
if (value == 4)
{
found = true;
break;
}
}
if (found)
{
break;
}
}
Console.WriteLine("Search finished");
}
}
1
2
3
4
Search finished
内层的 break 会停止扫描当前行。内层循环结束后,标志仍为 true,因此外层循环可以在下一次检查时停止。此示例会先打印每个值再进行检查,所以会打印 4;如果不应打印匹配值,请将检查移到前面。当判断条件出现在嵌套逻辑中,且需要外层循环据此停止时,标志很有用。如果条件可直接在外层循环中检查,使用普通的 break 会更清晰。
选择合适的退出方式
使用 break 结束当前循环,并继续执行当前方法。使用 return 同时结束当前方法。若内层循环发现外层循环也应停止,则使用标志。如果只需要跳过当前迭代剩余的部分并检查下一项,请使用 continue;它不会结束循环。这些都是 C# 控制流语句,不是方法调用。请选择作用范围与要停止的工作相符的语句,并根据是否应处理匹配项,决定在处理之前还是之后检查条件。