今回はC#(ver.7.0以降)、VB(ver. 15以降)でforeachループ内で繰り返し回数を参照する方法について解説していきます。
従来の記述方法とよりスマートに記述する方法の2通りを以下になります。
従来の記述方法
従来の記述方法は以下の通りです。
C#の場合
var collection = new Dictionary<string, string>(){
...省略...
};
int index = -1; //カウンター変数
foreach (var value in collection)
{
index++;
// indexを使った処理を書く...
}
VBの場合
Dim collection = New String() {...省略...}
Dim index As Integer = -1 ' カウンター変数
For Each value In collection
index +=1
' indexを使った処理を書く...
Next
上記のようにループ外でカウンター変数を定義しておけば、
ループ内でインクリメント(カウンターを増やしていく)すれば実現可能ですが、
このやり方だとカウンター変数を用意したりインクリメント処理を記述する必要があり、可読性が低いというデメリットがあります。
LINQ Select拡張メソッド
LINQのSelect拡張メソッド(System.Linq名前空間のEnumerableクラス)を使うことで、
上記のようなカウンター変数やインクリメント処理を記述せずに済みます。
記述例は以下の通りです。
C#の場合
using System.Collections.Generic;
using System.Linq;
...省略...
IEnumerable<string> collection = ...省略...
foreach(var item in collection.Select((Value, Index) => new{ Value, Index }))
)
{
string value = item.Value; //コレクションの要素
int index = item.index; //ループのインデックス
}
VBの場合
Dim collection As IEnumerable(Of String) = ...省略...
For Each item In collection.Select(Function(Value, Index) New With {Value, Index})
Dim value As String = item.Value ' コレクションの要素
Dim index As Integer = item.Index ' ループのインデックス
Next