C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のLINQを使ってリストをフラット化する方法

リストのフラット化とは

リストのフラット化(平滑化)とは、List<List<T>> のような入れ子になったリスト構造を、単一の List<T> に変換することを指します。例えば、List<List<int>>List<int> に変換するケースが典型的な例です。

LINQ の SelectMany メソッドは、シーケンスの各要素を IEnumerable<T> に射影し、その結果得られた複数のシーケンスを1つのシーケンスへと平坦化するために使用されます。つまり、SelectMany 演算子は複数の結果シーケンスに含まれるレコードを結合し、1つのまとまった結果へと変換する役割を担います。

C# では、メソッド構文(SelectMany)とクエリ構文(from 句の重ね書き)の2つの方法でリストをフラット化できます。以下にそれぞれの実装例を示します。

方法1:SelectMany メソッドを使用する

コード例

using System;
using System.Collections.Generic;
using System.Linq;

namespace DemoApplication
{
    public class Program
    {
        static void Main(string[] args)
        {
            List<List<int>> listOfNumLists = new List<List<int>>
            {
                new List<int> { 1, 2 },
                new List<int> { 3, 4 }
            };

            var numList = listOfNumLists.SelectMany(i => i);

            Console.WriteLine("リスト内の数値:");
            foreach (var num in numList)
            {
                Console.WriteLine(num);
            }
            Console.ReadLine();
        }
    }
}

出力結果

リスト内の数値:
1
2
3
4

この例では、SelectMany(i => i) によって各内部リストがそのまま展開され、すべての要素が1つのシーケンスに結合されています。ラムダ式 i => i は「各要素(内部リスト)をその要素自体のコレクションとして扱う」ことを意味します。

方法2:クエリ構文を使用する

コード例

using System;
using System.Collections.Generic;
using System.Linq;

namespace DemoApplication
{
    public class Program
    {
        static void Main(string[] args)
        {
            List<List<int>> listOfNumLists = new List<List<int>>
            {
                new List<int> { 1, 2 },
                new List<int> { 3, 4 }
            };

            var numList = from listOfNumList in listOfNumLists
                          from value in listOfNumList
                          select value;

            Console.WriteLine("リスト内の数値:");
            foreach (var num in numList)
            {
                Console.WriteLine(num);
            }
            Console.ReadLine();
        }
    }
}

出力結果

リスト内の数値:
1
2
3
4

クエリ構文では、from 句を2段階に重ねることでネストされたリストを展開しています。外側の from で各内部リストを取り出し、内側の from でそのリストの各要素を取得しています。このクエリは内部的には SelectMany に変換されるため、両者の動作は本質的に同じです。

まとめ

  • リストのフラット化は、入れ子構造の List<List<T>>List<T> へ変換する操作である。
  • メソッド構文では SelectMany を使用するのが最も簡潔。
  • クエリ構文では from 句を二重に記述することで同じ結果が得られる。
  1. JavaScriptで<select>リストの項目を事前選択(プリセレクト)する方法

    JavaScriptを使って<select>リストの項目を事前に選択状態にするには、selectedIndexプロパティを使用します。このプロパティに、あらかじめ選択しておきたい項目のインデックス番号を設定するだけで実現できます。<script>タグ内での記述方法は以下のとおりです。add_select_idには<select>タグに付けたidを、add_item_indexには数値のインデックスを指定します。なお、このインデックスは0から始まる点に注意してください。たとえば先頭の項目は「0」、2番目の項目は「1」となり、事前選択したい項目に対応する番号を設

  2. JavaScriptでHTMLリストを並べ替える方法を初心者向けに解説

    Webページ上のリスト(<ul>や<ol>)を、ボタンをクリックしたときに自動的にアルファベット順へ並べ替えたいケースはよくあります。JavaScriptを使えば、ページを再読み込みすることなく、DOMを直接操作してリスト項目の順序を入れ替えることができます。ここでは、「クリックすると並べ替えが実行されるボタン」を持つシンプルなサンプルを紹介します。サンプルコード<!DOCTYPE html> <html> <body> <h1>リスト並べ替えの例</h1> <button>クリックして並べ替え&l