ループ

# Foreach ループ

foreach は IEnumerable を実装するクラスの任意のオブジェクトを反復処理します (IEnumerable<T> に注意してください それを継承しています)。このようなオブジェクトには、いくつかの組み込みオブジェクトが含まれますが、これらに限定されません:List<T>T[] (任意のタイプの配列)、Dictionary<TKey, TSource> 、および IQueryable のようなインターフェース と ICollection など

構文

foreach(ItemType itemVariable in enumerableObject)
    statement;

備考

<オール>
  • タイプ ItemType アイテムの正確なタイプと一致する必要はありません。アイテムのタイプから割り当て可能である必要があります
  • ItemType の代わりに 、または var IEnumerable の一般的な引数を検査することにより、enumerableObject からアイテム タイプを推測するために使用できます。 実装
  • ステートメントは、ブロック、単一のステートメント、または空のステートメントにすることができます (; )
  • If enumerableObject IEnumerable を実装していません 、コードはコンパイルされません
  • 各反復中、現在のアイテムは ItemType にキャストされます (これが指定されていなくても、 var を介してコンパイラによって推測されます )、アイテムをキャストできない場合は InvalidCastException
  • 次の例を考えてみましょう:

    var list = new List<string>();
    list.Add("Ion");
    list.Add("Andrei");
    foreach(var name in list)
    {
        Console.WriteLine("Hello " + name);
    }
    
    

    と同等です:

    var list = new List<string>();
    list.Add("Ion");
    list.Add("Andrei");
    IEnumerator enumerator;
    try
    {
        enumerator = list.GetEnumerator();
        while(enumerator.MoveNext())
        {
            string name = (string)enumerator.Current;
            Console.WriteLine("Hello " + name);
        }
    }
    finally
    {
        if (enumerator != null)
            enumerator.Dispose();
    }
    
    

    # for ループ

    For ループは、一定時間処理を行う場合に最適です。 While ループに似ていますが、インクリメントが条件に含まれています。

    For ループは次のように設定されます:

    for (Initialization; Condition; Increment)
    {
        // Code
    }
    
    

    初期化 - ループ内でのみ使用できる新しいローカル変数を作成します。
    条件 - 条件が真の場合にのみループが実行されます。
    Increment - ループが実行されるたびに変数がどのように変化するか。

    例:

    for (int i = 0; i < 5; i++)
    {
        Console.WriteLine(i);
    }
    
    

    出力:

    0
    1
    2
    3
    4

    For ループでスペースを省略することもできますが、それが機能するにはすべてのセミコロンが必要です。

    int input = Console.ReadLine();    
    
    for ( ; input < 10; input + 2)
    {
        Console.WriteLine(input);
    }
    
    

    3 の出力:

    3
    5
    7
    9
    11

    # Do - While ループ

    while に似ています ループ。ただし、最後で条件をテストします ループ本体の。 Do - While ループは、条件が true であるかどうかに関係なく、ループを 1 回実行します。

    int[] numbers = new int[] { 6, 7, 8, 10 };
        
    // Sum values from the array until we get a total that's greater than 10,
    // or until we run out of values.
    int sum = 0;
    int i = 0;
    do
    {
        sum += numbers[i];
        i++;
    } while (sum <= 10 && i < numbers.Length);
        
    System.Console.WriteLine(sum); // 13
    
    

    # ループ スタイル

    その間

    最も単純なループ タイプ。唯一の欠点は、ループのどこにいるかを知る本質的な手がかりがないことです。

    /// loop while the condition satisfies
    while(condition)
    {
        /// do something
    }
    
    

    する

    while に類似 ですが、条件はループの最初ではなく最後に評価されます。これにより、ループが少なくとも 1 回実行されます。

    do
    {
        /// do something
    } while(condition) /// loop while the condition satisfies
    
    

    対象

    別の簡単なループ スタイル。インデックスをループしている間 (i )が増えて使えるようになります。通常、配列の処理に使用されます。

    for ( int i = 0; i < array.Count; i++ )
    {
        var currentItem = array[i];
        /// do something with "currentItem"
    }
    
    

    Foreach

    IEnumarable をループする最新の方法 オブジェクト。アイテムのインデックスやリストのアイテム数について考える必要がないのは良いことです。

    foreach ( var item in someList )
    {
        /// do something with "item"
    }
    
    

    Foreach メソッド

    コレクション内の要素の選択または更新には他のスタイルが使用されますが、このスタイルは通常、メソッドの呼び出しに使用されます。 コレクション内のすべての要素に対してすぐに。

    list.ForEach(item => item.DoSomething());
    
    // or
    list.ForEach(item => DoSomething(item));
    
    // or using a method group
    list.ForEach(Console.WriteLine);
    
    // using an array
    Array.ForEach(myArray, Console.WriteLine);
    
    

    このメソッドは List<T> でのみ使用できることに注意してください。 インスタンスおよび Array の静的メソッドとして - 違う Linq の一部です。

    Linq 並列 Foreach

    Linq Foreach と同じですが、これは並行してジョブを実行します。コレクション内のすべてのアイテムが指定されたアクションを同時に実行することを意味します。

    collection.AsParallel().ForAll(item => item.DoSomething());
    
    /// or
    collection.AsParallel().ForAll(item => DoSomething(item));
    
    

    # ネストされたループ

    // Print the multiplication table up to 5s
    for (int i = 1; i <= 5; i++)
    {
        for (int j = 1; j <= 5; j++)
        {
            int product = i * j;
            Console.WriteLine("{0} times {1} is {2}", i, j, product);
        }
    }
    
    

    # ブレーク

    ループの途中でループ条件をチェックする必要がある場合があります。前者は後者よりも間違いなくエレガントです:

    for (;;)
    {
        // precondition code that can change the value of should_end_loop expression
    
        if (should_end_loop)
            break;
    
        // do something
    }
    
    

    代替:

    bool endLoop = false;
    for (; !endLoop;)
    {
        // precondition code that can set endLoop flag
    
        if (!endLoop)
        {
            // do something
        }
    }
    
    

    注:ネストされたループおよび/または switch 内 単純な break 以上のものを使用する必要があります .

    # While ループ

    int n = 0;
    while (n < 5) 
    {
        Console.WriteLine(n);
        n++;
    }
    
    

    出力:

    0
    1
    2
    3
    4

    IEnumerators は while ループで反復できます:

    // Call a custom method that takes a count, and returns an IEnumerator for a list
    // of strings with the names of theh largest city metro areas.
    IEnumerator<string> largestMetroAreas = GetLargestMetroAreas(4);
    
    while (largestMetroAreas.MoveNext())
    {
        Console.WriteLine(largestMetroAreas.Current);
    }
    
    

    出力例:

    東京・横浜
    ニューヨークメトロ
    サンパウロ
    ソウル/仁川

    # 続行

    break に加えて 、キーワード continue もあります .ループを完全に中断する代わりに、単純に現在の反復をスキップします。特定の値が設定されている場合に一部のコードを実行したくない場合に便利です。

    以下に簡単な例を示します:

    for (int i = 1; i <= 10; i++)
    {
        if (i < 9)
            continue;
    
        Console.WriteLine(i);
    }
    
    

    結果:

    9
    10
    
    

    注: Continue 多くの場合、while または do-while ループで最も役立ちます。終了条件が明確に定義された for ループは、あまりメリットがない可能性があります。