MRが楽しい

MRやVRについて学習したことを書き残す

LinqのSelectManyを使って複数のリストを1つのリストにする

本日はC#の小ネタ枠です。
LinqのSelectManyを使って複数のリストを1つのリストにする方法を記事にします。

SelectMany

SelectManyは複数の配列を1つの配列に平坦化します。
learn.microsoft.com

// サンプルとして複数のリストを保持するリストを作成する
List<List<int>> list = new List<List<int>>
{
    new List<int> { 1, 2, 3 },
    new List<int> { 4, 5, 6 },
    new List<int> { 7, 8, 9 },
};

// SelectManyでList<List<int>>をList<int>に変換して値をログ出力する
list.SelectMany(x => x).ToList().ForEach(x => Debug.Log(x));

・実行結果

1
2
3
4
5
6
7
8
9

Selectと同様に各要素のインデックスを取得することもできます。

// サンプルとして複数のリストを保持するリストを作成する
List<List<int>> list = new List<List<int>>
{
    new List<int> { 1, 2, 3 },
    new List<int> { 4, 5, 6 },
    new List<int> { 7, 8, 9 },
};

// SelectManyでまとめる際にそれぞれのリスト番号を取得する
list.SelectMany((data, groupIndex) => 
        data.Select((listData, listIndex) =>
            new { data = listData, group = groupIndex, index = listIndex }))
    .ToList()
    .ForEach(x => Debug.Log($"group:{x.group}, index:{x.index}, data:{x.data}"));

・実行結果

group:0, index:0, data:1
group:0, index:1, data:2
group:0, index:2, data:3
group:1, index:0, data:4
group:1, index:1, data:5
group:1, index:2, data:6
group:2, index:0, data:7
group:2, index:1, data:8
group:2, index:2, data:9