Listクラスでは、foreach文による列挙の他に、ForEachメソッドによる列挙が出来るようになっています。 このメソッドは、引数に列挙時に個々の要素に対して行う操作をデリゲートとして指定します。

ForEachメソッドによる列挙は、foreach文による列挙と結果は同じであるものの、breakに相当する操作ができない、列挙する要素の数だけデリゲート呼び出しが行われるといった不都合があるため、ほとんどの場合では強いてForEachメソッドを使って列挙しなければならない必要性はありません。

foreach文・ForEachメソッドを使ってList内の要素を列挙する(匿名メソッド版) 
using System;
using System.Collections.Generic;

class Sample {
  static void Main()
  {
    var list = new List<string>() {"Alice", "Bob", "Charlie", "Dave", "Eve"};

    // foreach文による列挙
    Console.WriteLine("[foreach]");

    foreach (var e in list) {
      Console.WriteLine(e);
    }

    // ForEachメソッドによる列挙
    Console.WriteLine("[ForEach]");

    list.ForEach(delegate(string e) {
      Console.WriteLine(e);
    });
  }
}
実行結果
[foreach]
Alice
Bob
Charlie
Dave
Eve
[ForEach]
Alice
Bob
Charlie
Dave
Eve

foreach文で列挙している途中にRemoveメソッドやAddメソッドなどを呼び出してListクラスの内容を変更することは無効な操作であるため、例外InvalidOperationExceptionがスローされます。

ForEachメソッドを使った列挙の場合でも同様に無効な操作となりますが、.NET Framework 4.0以前ではInvalidOperationExceptionがスローされず、.NET Framework 4.5以降ではスローされるようになっています。 この点については列挙操作中のコレクションの変更 §.List.ForEachメソッドとコレクションの変更で詳しく解説しています。