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# 控制流语句,不是方法调用。请选择作用范围与要停止的工作相符的语句,并根据是否应处理匹配项,决定在处理之前还是之后检查条件。