【C#】LINQのSelectを使用して要素のインデックス(index)を取得する方法

C#の LINQ における便利な小技として「要素の index(インデックス)」を取得方法があります。例えば「〇番目の要素を取り出したいとき」などの場面では便利なので重宝しています。コレクションの要素のインデックスを取得するには Select句 を使用することで可能です。

LINQについて不慣れな人は上の記事も併せてチェックしておくとよいでしょう。なお、Select句では以下のように、インデックスを組み込んだ射影の定義がされています。

public static System.Collections.Generic.IEnumerable<TResult> Select<TSource,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,int,TResult> selector);

射影する方法、特定のインデックスの値を取得する方法、すべての要素を書き出す方法のサンプルを作成しました。

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

// 要素のインデックスを組み込んだ射影
var withIndex = list.Select((x, i) => (x, i));

//3番目の値を取得する(インデックスは2)
var three = list
    .Select((x, i) => (x, i))
    .FirstOrDefault(x => x.i.Equals(2));

//書き出す方法1
list
    .Select((x, i) => (x, i))
    .ToList()
    .ForEach(x => Console.WriteLine($"{x.i} : {x.x}"));

//書き出す方法2
foreach (var l in list.Select((x, i) => (x, i)))
{
    Console.WriteLine($"{l.i} : {l.x}");
}

Select句の第二引数からインデックスが取得できるのは、とても便利なので覚えておくとよいでしょう。現場でもよく重宝しています。なお、インデックス値なので番号は「0」スタートになるので注意してください。