カテゴリ: C# 更新日: 2026/03/10

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で果物のリストを種類ごとにグループ化するサンプルコードを見てみましょう。


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

class Program
{
    static void Main()
    {
        List<string> fruits = new List<string>
        {
            "りんご", "みかん", "りんご", "バナナ", "みかん", "りんご"
        };

        var grouped = fruits.GroupBy(f => f);

        foreach (var group in grouped)
        {
            Console.WriteLine($"果物の種類: {group.Key}");
            foreach (var item in group)
            {
                Console.WriteLine($"  - {item}");
            }
        }
    }
}

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

この例では、同じ果物がまとめられて出力されます。group.Keyは「グループの名前(ここでは果物の種類)」を表しています。

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

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

次に、グループごとに「何個あるか」を数えてみましょう。LINQのCountを使うと、数える処理がとても簡単に書けます。


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

class Program
{
    static void Main()
    {
        List<string> fruits = new List<string>
        {
            "りんご", "みかん", "りんご", "バナナ", "みかん", "りんご"
        };

        var grouped = fruits.GroupBy(f => f)
                            .Select(g => new { Name = g.Key, Count = g.Count() });

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

りんごの数: 3
みかんの数: 2
バナナの数: 1

このように、GroupByCountを組み合わせると、種類ごとの数を簡単に集計できます。

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
C#
C#で条件分岐をネストする方法!入れ子構造の書き方を基礎から学ぼう
New2
COBOL
COBOLの文字列検索を完全ガイド!初心者でもわかるINSPECTとUNSTRINGの使い方
New3
C#
C#でXMLバリデーションを完全マスター!XSDスキーマを使ったチェック方法を初心者向けに解説
New4
COBOL
COBOLのEDITING記述子を完全解説!初心者でもわかるPIC Z・\*・\$による整形出力
人気記事
No.1
Java&Spring記事人気No1
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.2
Java&Spring記事人気No2
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう
No.3
Java&Spring記事人気No3
C#
C#のstaticクラスとstaticメソッドの基本と使い方をやさしく解説!
No.4
Java&Spring記事人気No4
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.5
Java&Spring記事人気No5
C#
C#のLINQでFirstとFirstOrDefaultの違いと使い方を完全解説!初心者向けガイド
No.6
Java&Spring記事人気No6
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.7
Java&Spring記事人気No7
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.8
Java&Spring記事人気No8
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!