ListのForEachでインデックス付きループ
C#のForEachでインデックス付きループを簡単に実現できる方法がないかと調べて、LinQのSelectで実装したのが半年前。最近、再び必要になったのですが、どうやるのか完全に忘れていたので、メモとして残しておきます。
コード
通常のループ
var colors = new List<string>(){ "red", "green", "blue" };
var i = 0;
colors.ForEach(name => {
Console.WriteLine("{0} => {1}", i, name);
i++;
});
LinQのSelectを使ったインデックス付きループ
var colors = new List<string>(){ "red", "green", "blue" };
colors
.Select((name, index) => new { name, index })
.ToList()
.ForEach(color => {
Console.WriteLine("{0} => {1}", color.index, color.name);
});
上記の実行結果はどちらも以下の出力となります。
0 => red
1 => green
2 => blue
通常のループはスコープ外に変数を用意しないといけないのが微妙。LinQのSelectを使った方法はこれを改善してくれますが、当然、通常のループよりも処理が遅くなるので、そこまでパフォーマンスが重要でない処理で使用します。