コレクションのループ処理で、要素とインデックスを使用したい場合の書き方

C#のお話です。

以下のようなコレクションitemsの各要素にたいして処理を行なう際に、処理内でインデックスが必要な場合はどのようなコードにするのが良いかについて。


var items = new[] { "a", "b", "c" };

 
レガシーな書き方だと以下です。
いまどきfor文でループしたくないですよね。


for(int index = 0; index < items.Length; index++) {
    var item = items[index];
    //indexとitemを使用する処理
}

 
foreachだと以下です。
forよりはマシですが、itemsからインデクサを使用して要素を取得するところが残念です。


foreach(var index in Enumerable.Range(0, items.Length)) {
    var item = items[index];
    //indexとitemを使用する処理
}

インフォテックの社内ライブラリを使用する場合、IListの拡張メソッドForEachが実装してあるので、以下のように実装できます。


items.ForEach((index, item) => {
    //indexとitemを使用する処理
});

上記の方法でだいたいは問題ないのですが、処理をラムダ式で実装出来なかったり、出来ても複雑になってしまう場合、インフォテックの社内ライブラリにIListの拡張メソッドAndIndexが実装してあるので、以下のように実装できます。


foreach (var (item, index) in items.AndIndex()) {
    //indexとitemを使用する処理
}

追加した拡張メソッドはとても単純な実装内容ですが、たったそれだけでコードが非常に分かりやすくなっていると思います。

コメントを残す