Listクラスでは、foreach
文による列挙の他に、ForEachメソッドによる列挙が出来るようになっています。 このメソッドは、引数に列挙時に個々の要素に対して行う操作をデリゲートとして指定します。
ForEachメソッドによる列挙は、foreach
文による列挙と結果は同じであるものの、break
に相当する操作ができない、列挙する要素の数だけデリゲート呼び出しが行われるといった不都合があるため、ほとんどの場合では強いてForEachメソッドを使って列挙しなければならない必要性はありません。
foreach文・ForEachメソッドを使ってList内の要素を列挙する(ラムダ式版) VB10
Imports System
Imports System.Collections.Generic
Class Sample
Shared Sub Main()
Dim list As New List(Of String)(New String() {"Alice", "Bob", "Charlie", "Dave", "Eve"})
' For Eachステートメントによる列挙
Console.WriteLine("[For Each statement]")
For Each e As String In list
Console.WriteLine(e)
Next
' ForEachメソッドによる列挙
Console.WriteLine("[ForEach]")
list.ForEach(Sub(e) Console.WriteLine(e))
End Sub
End Class
実行結果
[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メソッドとコレクションの変更で詳しく解説しています。