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>。如果符合條件的項目不應進行後續處理,請把條件檢查放在該項目相關工作的前面;若放在工作之後,迴圈停止前就會先處理該項目。範例輸出中的 Loop finished 標籤會依照原始範例保留英文。

使用 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# 控制流程陳述式,不是方法呼叫。請依照要停止的工作範圍選擇陳述式,並根據是否應處理符合條件的項目,將條件檢查放在處理之前或之後。