HOWTO · Csharp

C# で Foreach ループを終了する

このガイドでは、C# で foreach ループを終了する方法を学習します。

このページの内容

C# の foreach ループで条件に一致した時点で反復を止めるには、break を使います。break は最も内側のループを終了し、そのループの直後にある最初の文へ処理を進めます。ループを含むメソッドも終了する必要がある場合は return を使います。入れ子のループでは、内側のループで成立した条件をフラグに記録し、その後で外側のループを break します。

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") が実行されます。出力に表示される 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 とは、この点が異なります。戻り値のあるメソッドでは、どの経路でも宣言された戻り値の型に合う値を返す必要があります。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 を使います。continue はループを終了しません。これらは C# の制御フロー文であり、メソッド呼び出しではありません。止めたい処理の範囲に合う文を選び、一致した項目を処理するかどうかに応じて、処理の前後どちらで条件を判定するか決めてください。