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