佐々木屋

技術的なことから趣味まで色々書きます

インデックス付き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)