インデックス付きSelectメソッド
コレクションの要素を処理する際、ナンバリングが必要なことがたまにあります。
通常であれば、以下のようにfor文を使ってナンバリングするのでしょうが・・・。
string[] values = { "京都", "奈良", "大阪", "兵庫", "滋賀", "和歌山" }; var res = new List<string>(); for (int i= 0; i < values.Count(); ++i) { res.Add(i.ToString() + ":" + values[i]); } Console.WriteLine(String.Join(",", res));
Dim values As String() = {"京都", "奈良", "大阪", "兵庫", "滋賀", "和歌山"} Dim res = New List(Of String)() For i As Integer = 0 To values.Count() - 1 res.Add(i.ToString() & ":" & values(i)) Next Console.WriteLine(String.Join(",", res))
0:京都,1:奈良,2:大阪,3:兵庫,4:滋賀,5:和歌山
LINQのSelectメソッドはインデックスを射影するオーバーロードがあります。
var res = values.Select((x, index) => index.ToString() + ":" + x).ToArray(); Console.WriteLine(String.Join(",", res));
Dim res = values.Select(Function(x, index) index.ToString() & ":" & x).ToArray() Console.WriteLine(String.Join(",", res))
インデックスを利用して、Whereメソッドに応用することも可能です。
また、インデックスはユニークですので、これを利用してDictionaryクラスに変換することも可能です。
var dic = values1.Select((x, index) => new { index, x }).ToDictionary(x => x.index, x => x.x);
Dim dic = values1.Select(Function(x, index) New With {index, x}).ToDictionary(Function(x) x.index, Function(x) x.x)