foreach、in (C# リファレンス)foreach, in (C# Reference)

foreach ステートメントは、System.Collections.IEnumerable または System.Collections.Generic.IEnumerable<T> インターフェイスを実装している型のインスタンス内の要素ごとに、ステートメントまたはステートメントのブロックを実行します。The foreach statement executes a statement or a block of statements for each element in an instance of the type that implements the System.Collections.IEnumerable or System.Collections.Generic.IEnumerable<T> interface. foreach ステートメントはこのような型にのみ限定されるものではありません。次の条件を満たす任意の型のインスタンスに適用できます。The foreach statement is not limited to those types and can be applied to an instance of any type that satisfies the following conditions:

  • 戻り値の型がクラス、構造体、インターフェイス型のいずれかである、パラメーターなしのパブリック メソッド GetEnumerator を持っている。has the public parameterless GetEnumerator method whose return type is either class, struct, or interface type,
  • GetEnumerator メソッドの戻り値の型が、パブリック プロパティ Current と、戻り値の型が Boolean であるパラメーターなしのパブリック メソッド MoveNext を持っている。the return type of the GetEnumerator method has the public Current property and the public parameterless MoveNext method whose return type is Boolean.

foreach ステートメント ブロック内の任意の位置で、break ステートメントを使ってループから抜けることができます。または、continue ステートメントを使って、ループ内の次の繰り返しにスキップできます。At any point within the foreach statement block, you can break out of the loop by using the break statement, or step to the next iteration in the loop by using the continue statement. また、gotoreturnthrow ステートメントのいずれかを使って foreach ループを終了することもできます。You also can exit a foreach loop by the goto, return, or throw statements.

使用例Examples

注意

この記事の C# 例は、Try.NET インライン コード ランナーとプレイグラウンドで実行されます。The C# examples in this article run in the Try.NET inline code runner and playground. [実行] ボタンを選択すると、対話型ウィンドウで例が実行されます。Select the Run button to run an example in an interactive window. コードを実行したら、コードを変更し、[実行] をもう一度選択して変更後のコードを実行できます。Once you execute the code, you can modify it and run the modified code by selecting Run again. 変更後のコードが対話型ウィンドウで実行されるか、コンパイルできなかった場合、対話型ウィンドウにすべての C# コンパイラ エラー メッセージが表示されます。The modified code either runs in the interactive window or, if compilation fails, the interactive window displays all C# compiler error messages.

次の例では、IEnumerable<T> インターフェイスを実装する List<T> 型のインスタンスを使用して、foreach ステートメントの使用方法を示します。The following example shows usage of the foreach statement with an instance of the List<T> type that implements the IEnumerable<T> interface:

var fibNumbers = new List<int> { 0, 1, 1, 2, 3, 5, 8, 13 };
int count = 0;
foreach (int element in fibNumbers)
{
    count++;
    Console.WriteLine($"Element #{count}: {element}");
}
Console.WriteLine($"Number of elements: {count}");

次の例では、何のインターフェイスも実装していない System.Span<T> 型のインスタンスを使用して、foreach ステートメントを使用します。The next example uses the foreach statement with an instance of the System.Span<T> type, which doesn't implement any interfaces:

public class IterateSpanExample
{
    public static void Main()
    {
        Span<int> numbers = new int[] { 3, 14, 15, 92, 6 };
        foreach (int number in numbers)
        {
            Console.Write($"{number} ");
        }
        Console.WriteLine();
    }
}

C# 7.3 以降、列挙子の Current プロパティが、参照戻り値 (ref T``T はコレクション要素の種類です) を返す場合、ref または ref readonly 修飾子を使用して繰り返し変数を宣言することができます。Beginning with C# 7.3, if the enumerator's Current property returns a reference return value (ref T where T is the type of the collection element), you can declare the iteration variable with the ref or ref readonly modifier. 次の例では、stackalloc 配列内の各項目の値を設定するために、ref 繰り返し変数を使用します。The following example uses a ref iteration variable to set the value of each item in a stackalloc array. ref readonly バージョンは、すべての値を出力するコレクションを反復処理します。The ref readonly version iterates the collection to print all the values. readonly 宣言では、暗黙のローカル変数宣言を使用します。The readonly declaration uses an implicit local variable declaration. 暗黙の変数宣言は、ref または ref readonly 宣言で使用でき、変数の宣言を明示的に型指定できます。Implicit variable declarations can be used with either ref or ref readonly declarations, as can explicitly typed variable declarations.

public class ForeachRefExample
{
    public static void Main()
    {
        Span<int> storage = stackalloc int[10];
        int num = 0;
        foreach (ref int item in storage)
        {
            item = num++;
        }

        foreach (ref readonly var item in storage)
        {
            Console.Write($"{item} ");
        }
        // Output:
        // 0 1 2 3 4 5 6 7 8 9
    }
}

C# 言語仕様C# language specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

関連項目See also

foreach ステートメント (C# 言語仕様)The foreach statement (C# language specification)
配列での foreach の使用Using foreach with Arrays
forfor
繰り返しステートメントIteration Statements
C# のキーワードC# Keywords
C# リファレンスC# Reference
C# プログラミング ガイドC# Programming Guide