カテゴリ: C# 更新日: 2026/06/04

C#のLINQでグループ化と集計!GroupByとCountを初心者向けに解説

C#のLINQでグループ化・集計(GroupBy・Count)を行う方法
C#のLINQでグループ化・集計(GroupBy・Count)を行う方法

先生と生徒の会話形式で理解しよう

生徒

「C#のLINQでデータをまとめたり数えたりすることはできますか?」

先生

「はい、できますよ。LINQにはGroupByでグループ化、Countで数を数える便利な機能があります。」

生徒

「例えば、同じ種類ごとに分けて集計する、みたいなことですか?」

先生

「そうです!身近な例で言うと、クラスの生徒を『出席番号ごと』や『好きな科目ごと』にまとめて数えるイメージですね。」

1. LINQのGroupByとは?仕組みをわかりやすく解説

1. LINQのGroupByとは?仕組みをわかりやすく解説
1. LINQのGroupByとは?仕組みをわかりやすく解説

C#のLINQ(リンク)で提供されているGroupByは、バラバラに並んだデータを「ある共通点」に注目してグループ分けする機能です。例えば、たくさんの果物がカゴに入っている状態から、「りんごのグループ」「みかんのグループ」というように、種類ごとに箱へ仕分ける作業をイメージすると分かりやすいでしょう。

これは、Excel(エクセル)の「ピボットテーブル」や「データフィルタ」で同じ項目をまとめる操作と非常によく似ています。プログラミングにおいても、大量のデータを整理して分析する際には欠かせない、基本中の基本となるテクニックです。

ポイント: GroupByを使うと、単にデータを分けるだけでなく、後から「グループごとの合計」や「グループ内の個数」を計算しやすくなります。

まずは、プログラミングが初めての方でもイメージしやすいように、色とりどりのボールを色ごとに仕分ける簡単なプログラムを見てみましょう。


using System;
using System.Collections.Generic;
using System.Linq; // LINQを使うために必要です

class Program
{
    static void Main()
    {
        // 1. バラバラな色のボールのリストを用意します
        List<string> balls = new List<string> { "赤", "青", "赤", "黄色", "青", "赤" };

        // 2. GroupByを使って「色(自分自身の値)」ごとにグループ化します
        // b => b は「ボールの色そのもので分けるよ」という意味です
        var groupedBalls = balls.GroupBy(b => b);

        // 3. 結果を表示してみましょう
        foreach (var group in groupedBalls)
        {
            // group.Key には「赤」や「青」といったグループ名が入ります
            Console.WriteLine($"{group.Key}色のグループが作られました!");
        }
    }
}

赤色のグループが作られました!
青色のグループが作られました!
黄色のグループが作られました!

このように、GroupByを実行すると、データの中身を自動的にスキャンして、重複しない「グループの代表(Keyと言います)」を抽出してくれます。これを使うことで、複雑な条件分岐(if文など)を何度も書くことなく、スマートにデータを整理できるのが最大のメリットです。

2. GroupByの基本的な使い方

2. GroupByの基本的な使い方
2. GroupByの基本的な使い方

C#のLINQ(リンク)の中でも、データの整理に欠かせないのがGroupByメソッドです。これは、バラバラに並んだデータの中から「同じ特徴を持つもの」を一つのグループとしてまとめる機能です。

プログラミング初心者の方でもイメージしやすいよう、カゴに入った「果物のリスト」を種類ごとに仕分けするシンプルな例を見てみましょう。難しい設定は抜きにして、まずは「どう動くか」を体験してみてください。


using System;
using System.Collections.Generic;
using System.Linq; // LINQを使うために必要です

class Program
{
    static void Main()
    {
        // 1. バラバラの果物リストを作成
        List<string> fruits = new List<string>
        {
            "りんご", "みかん", "りんご", "バナナ", "みかん", "りんご"
        };

        // 2. GroupByを使って種類ごとにグループ化
        // f => f は「果物の名前そのものをグループ化の基準にする」という意味です
        var grouped = fruits.GroupBy(f => f);

        // 3. グループ化された結果を表示
        foreach (var group in grouped)
        {
            // group.Key にはグループの基準(ここでは「りんご」など)が入ります
            Console.WriteLine($"【果物の種類: {group.Key}】");
            
            foreach (var item in group)
            {
                Console.WriteLine($"  - {item}");
            }
        }
    }
}

実行結果:


【果物の種類: りんご】
  - りんご
  - りんご
  - りんご
【果物の種類: みかん】
  - みかん
  - みかん
【果物の種類: バナナ】
  - バナナ

このコードでは、LINQのGroupByが自動的にリストをスキャンし、同じ名前を見つけては専用の「箱」に仕分けてくれています。

ポイントは、group.Keyというプロパティです。これは「グループの名前(仕分けの基準)」を指しています。例えば、りんごが3つあっても、グループとしての見出しは1つにまとめられるため、集計や分類が非常にスムーズに行えます。この仕組みを理解すると、大量のデータから特定の項目を抽出する処理が驚くほど簡単になります。

3. Countでグループごとの数を数える

3. Countでグループごとの数を数える
3. Countでグループごとの数を数える

次に、GroupByで分けたグループの中にデータが「何個あるか」を数えてみましょう。C#のLINQにあるCountメソッドを使うと、面倒なループ処理や複雑な条件分岐を書かなくても、1行で集計処理を完結させることができます。

プログラミング未経験の方でも分かりやすいように、身近な「果物のカゴ」をイメージしたサンプルを用意しました。例えば、バラバラに入っているリンゴやミカンを種類別に仕分けして、それぞれの個数をパッと数え上げるようなイメージです。


using System;
using System.Collections.Generic;
using System.Linq; // LINQを使うために必要です

class Program
{
    static void Main()
    {
        // 1. バラバラに入っている果物のリストを作成
        List<string> fruits = new List<string>
        {
            "りんご", "みかん", "りんご", "バナナ", "みかん", "りんご"
        };

        // 2. GroupByで種類ごとに分け、Countでその数を数える
        // Nameという名前に「果物の名前」、Countという名前に「数えた結果」を格納します
        var grouped = fruits.GroupBy(f => f)
                            .Select(g => new { Name = g.Key, Count = g.Count() });

        // 3. 数えた結果を画面に表示する
        Console.WriteLine("--- 集計結果 ---");
        foreach (var item in grouped)
        {
            Console.WriteLine($"{item.Name}は全部で {item.Count} 個あります。");
        }
    }
}

--- 集計結果 ---
りんごは全部で 3 個あります。
みかんは全部で 2 個あります。
バナナは全部で 1 個あります。

いかがでしょうか。GroupByで「同じ種類をまとめる台」を作り、Count()で「その台の上にある数を数える」という2ステップの連携が、LINQの強力なポイントです。この書き方を覚えるだけで、在庫管理システムやアンケート集計など、実務でよくあるデータ集計が驚くほど短く、そして直感的に書けるようになります。

4. 現実のイメージで理解する

4. 現実のイメージで理解する
4. 現実のイメージで理解する

ここまでの例を現実のイメージで考えてみましょう。たとえば、クラスで「好きなスポーツ」をアンケートしたとします。野球が好きな人が3人、サッカーが好きな人が2人、バスケが1人だった場合、それをC#のLINQで表すと、GroupByで「スポーツごとにまとめ」、Countで「人数を数える」といった処理になります。

つまり、GroupByは仕分け役、Countは人数を数える役と覚えると理解しやすいです。

5. 応用例:商品と在庫数の集計

5. 応用例:商品と在庫数の集計
5. 応用例:商品と在庫数の集計

最後にもう一つ、少し実用的な例を紹介します。商品リストから商品ごとに在庫の数を集計する場合です。


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

class Program
{
    class Product
    {
        public string Name { get; set; }
        public int Quantity { get; set; }
    }

    static void Main()
    {
        var products = new List<Product>
        {
            new Product { Name = "ペン", Quantity = 5 },
            new Product { Name = "ノート", Quantity = 3 },
            new Product { Name = "ペン", Quantity = 2 },
            new Product { Name = "消しゴム", Quantity = 4 }
        };

        var grouped = products.GroupBy(p => p.Name)
                              .Select(g => new { Name = g.Key, Total = g.Sum(p => p.Quantity) });

        foreach (var g in grouped)
        {
            Console.WriteLine($"{g.Name}の合計数: {g.Total}");
        }
    }
}

ペンの合計数: 7
ノートの合計数: 3
消しゴムの合計数: 4

ここではSumも一緒に使っていますが、Countだけでなく合計などの集計にも応用できるのがLINQの強みです。

まとめ

まとめ
まとめ

C#のLINQにおけるGroupByCountは、データの集計処理やグループ化をとてもシンプルにしてくれる重要な機能です。たとえば、同じ種類のデータをまとめて、その個数や合計などを簡単に算出できます。これは日常業務やアプリケーション開発において、非常に実用的で役立つ場面が多い機能です。

特にGroupByは、同じ値を持つデータを「まとめる」ための機能です。例えば、果物リストの中に「りんご」が3つ、「みかん」が2つ、「バナナ」が1つあったとすると、それをそれぞれの果物ごとに仕分けてくれます。この仕分けをしたあとに、それぞれのグループで何個あるかを数えるのがCountの役割です。

この組み合わせを覚えることで、販売データの分析やアンケートの集計、在庫管理、ログの解析など、様々な分野に応用することができます。また、さらに高度な操作としてSumAverageMaxなどを加えることで、数値の合計や平均、最大値などの統計的な処理も簡単に実装できます。

実務では、たとえば「商品ごとの在庫数をまとめたい」「部署ごとの社員数を数えたい」「日付ごとの売上合計を出したい」といった処理が日常的に発生します。こういったケースでも、LINQのGroupByCountの活用によって、短くて見やすいコードで処理が書けるのが大きな魅力です。

集計処理の応用サンプル


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

class Program
{
    class Student
    {
        public string Subject { get; set; }
    }

    static void Main()
    {
        var students = new List<Student>
        {
            new Student { Subject = "数学" },
            new Student { Subject = "英語" },
            new Student { Subject = "数学" },
            new Student { Subject = "理科" },
            new Student { Subject = "英語" },
            new Student { Subject = "数学" }
        };

        var grouped = students
            .GroupBy(s => s.Subject)
            .Select(g => new { Subject = g.Key, Count = g.Count() });

        foreach (var group in grouped)
        {
            Console.WriteLine($"{group.Subject}の人数: {group.Count}");
        }
    }
}

この例では、生徒の好きな教科をGroupByで分類し、Countで各教科を選んだ人数を出力しています。
このようなLINQの使い方を覚えておけば、どんなデータがあっても瞬時に「グループ化+集計」ができるようになります。

また、複雑なネスト構造のデータでも同じように処理できるため、JSON形式のAPIレスポンスやデータベースの結果などにも対応可能です。
応用力が広がるので、まずは「グループ化→集計」の基本的な流れをしっかりと理解し、手を動かして慣れることが大切です。

先生と生徒の振り返り会話

生徒

「先生、GroupByとCountの組み合わせ、すごく便利ですね!一行で分類して数えられるなんて!」

先生

「その通りです。複雑なfor文を使わなくても、LINQを使えばデータ集計がぐっと簡単になります。」

生徒

「果物リストや商品リストで試してみたら、あっという間にまとめられて感動しました!」

先生

「他にもSumやAverageなど、LINQには便利な集計メソッドがたくさんあります。Countと一緒に覚えておくと、もっと活用の幅が広がりますよ。」

生徒

「なるほど!Sumも使って在庫の合計が出せるのは驚きでした。GroupByと一緒に使うことで、いろんな集計処理が簡単にできるんですね。」

先生

「その理解は素晴らしいです。今後は実際のプロジェクトや業務データでもLINQを使って、効率的なデータ処理に挑戦してみてください。」

生徒

「はい!GroupByとCountは絶対に忘れません!いろんな集計に活用してみます!」

カテゴリの一覧へ
新着記事
New1
COBOL
COBOLのEVALUATE文の使い方を完全ガイド!初心者でもわかる多岐選択
New2
C#
C#の拡張メソッドとは?既存クラスに機能を追加する便利技
New3
C#
ASP.NET CoreとC#の例外処理ベストプラクティス!エラーハンドリングの基本と実装方法
New4
Azure
Azure WAFとは?SQLインジェクションやXSSからWebサイトを守る初心者ガイド
人気記事
No.1
Java&Spring記事人気No1
C#
C#のstaticクラスとstaticメソッドの基本と使い方をやさしく解説!
No.2
Java&Spring記事人気No2
C#
C#のWPFとは?XAMLでGUI開発を基礎から完全解説!初心者向けの入門ガイド
No.3
Java&Spring記事人気No3
C#
C# WinForms入門!初心者でも簡単にWindowsアプリを作る方法
No.4
Java&Spring記事人気No4
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.5
Java&Spring記事人気No5
COBOL
COBOLのファイルステータス(FILE STATUS)の使い方を完全ガイド!初心者でもわかるエラー処理の基本
No.6
Java&Spring記事人気No6
C#
C#のイベント処理を完全攻略!WinFormsとWPFの基本を解説
No.7
Java&Spring記事人気No7
C#
C#のbool型を完全解説!初心者でもわかるtrueとfalseの基本と使い方
No.8
Java&Spring記事人気No8
C#
C#でファイルパス操作の便利なテクニック!Pathクラスの使い方をわかりやすく解説