LINQを使用して要素のindexを取得する方法

LINQ の小技として要素のインデックスを取得するサンプルソースを公開します。シンプルにint型のリストを作成して要素を1~5としました。LINQ の Select 句を使うことで要素の index を取得できます。2つの方法を作成してみました。

var list = new List<int>()
{
    1, 2, 3, 4, 5,
};

//Tupleを生成
var indexList = list
    .Select((item, index) => (item, index))
    .ToList();
indexList.ForEach(tpl =>
{
    Console.WriteLine($"index={ tpl.index } : { tpl.item.ToString() }");
    //index=0 : 1
    //index=1 : 2
    //index=2 : 3
    //index=3 : 4
    //index=4 : 5
});

別の方法としては Select 句の特性である「射影」を利用して、新しいオブジェクトを使用してインデックスを取得する方法も使えるかなと思います。汎用的に使えるのは Select を使用した以下の方法かもしれません。覚えておいて損のない方法ですね。

var list = new List<int>()
{
    1, 2, 3, 4, 5,
};

var obj = list
    .Select((item, i) => new { Index = i, Item = item, })
    .ToList();
obj.ForEach(pair =>
{
    Console.WriteLine($"{ pair.Index } : { pair.Item.ToString() }");
    //0 : 1
    //1 : 2
    //2 : 3
    //3 : 4
    //4 : 5
});

上記のように C# におけるメイン機能ともいえる Linq でも、Index を取得して処理に使用することが可能になります。Select 句ではデリゲートの第二引数が index となることはあまり知られていないので、改めてこちらを利用してみてはいかがでしょうか。

なおLINQやデリゲートといった知識を再復習するならば、当ウェブサイトで連載した「C# デリゲートとラムダ式【モダンコード】」の記事一覧を確認してみてもよいでしょう。