Visual BasicにはForループとFor Eachループがあり、それぞれ特定のタスクに適しています。
VB6および古典的なVisual Basicは、範囲によるループ(For ... Next)のみをサポートしていました。新しいバージョン(VB6およびVB.NET以降)では、コレクションや配列の要素をエlegantlyに反復処理できるFor Eachが追加されました。
主な問題は、ループのタイプを誤って選択することや、For Each内でコレクションを変更しようとすることで、実行時エラーが発生することです。
通常のForを使用する必要がある場合:
For Eachを適用する必要がある場合:
コードの例:
' 要素を変更しながらループする Dim arr() As Integer = {1, 2, 3} For i As Integer = 0 To arr.Length - 1 arr(i) = arr(i) * 2 Next ' コレクションの読み取りのみ Dim list As New List(Of String) From {"one", "two", "three"} For Each s As String In list Console.WriteLine(s) Next
重要なポイント:
For Each内でList(Of T)コレクションを変更することはできますか?
できません。これはInvalidOperationExceptionを引き起こします。なぜなら、イテレーション中にコレクションの構造を変更してはいけないからです。
どうすればFor Eachを早く中断できますか?
必要な要素が見つかったときにはExit Forステートメントを使用してください。
For Each s In list If s = "two" Then Exit For End If Next
配列におけるForとFor Eachの速度の違いは何ですか?
通常、違いは最小限ですが、Forはインデックスを直接扱うため若干速い場合があります。一方、For Eachは追加の列挙子オブジェクトを作成します。
ネガティブケース
開発者がFor Each内でList(Of T)から要素を削除しようとしています。実行時にInvalidOperationExceptionエラーを取得します。
利点:
欠点:
ポジティブケース
要素を削除するために、通常のForを使って末尾から順にループします:
For i = list.Count - 1 To 0 Step -1 If list(i) = "two" Then list.RemoveAt(i) End If Next
利点:
欠点: