C#のLINQでグループ化と集計!GroupByとCountを初心者向けに解説
生徒
「C#のLINQでデータをまとめたり数えたりすることはできますか?」
先生
「はい、できますよ。LINQにはGroupByでグループ化、Countで数を数える便利な機能があります。」
生徒
「例えば、同じ種類ごとに分けて集計する、みたいなことですか?」
先生
「そうです!身近な例で言うと、クラスの生徒を『出席番号ごと』や『好きな科目ごと』にまとめて数えるイメージですね。」
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の基本的な使い方
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でグループごとの数を数える
次に、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. 現実のイメージで理解する
ここまでの例を現実のイメージで考えてみましょう。たとえば、クラスで「好きなスポーツ」をアンケートしたとします。野球が好きな人が3人、サッカーが好きな人が2人、バスケが1人だった場合、それをC#のLINQで表すと、GroupByで「スポーツごとにまとめ」、Countで「人数を数える」といった処理になります。
つまり、GroupByは仕分け役、Countは人数を数える役と覚えると理解しやすいです。
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におけるGroupByとCountは、データの集計処理やグループ化をとてもシンプルにしてくれる重要な機能です。たとえば、同じ種類のデータをまとめて、その個数や合計などを簡単に算出できます。これは日常業務やアプリケーション開発において、非常に実用的で役立つ場面が多い機能です。
特にGroupByは、同じ値を持つデータを「まとめる」ための機能です。例えば、果物リストの中に「りんご」が3つ、「みかん」が2つ、「バナナ」が1つあったとすると、それをそれぞれの果物ごとに仕分けてくれます。この仕分けをしたあとに、それぞれのグループで何個あるかを数えるのがCountの役割です。
この組み合わせを覚えることで、販売データの分析やアンケートの集計、在庫管理、ログの解析など、様々な分野に応用することができます。また、さらに高度な操作としてSumやAverage、Maxなどを加えることで、数値の合計や平均、最大値などの統計的な処理も簡単に実装できます。
実務では、たとえば「商品ごとの在庫数をまとめたい」「部署ごとの社員数を数えたい」「日付ごとの売上合計を出したい」といった処理が日常的に発生します。こういったケースでも、LINQのGroupByとCountの活用によって、短くて見やすいコードで処理が書けるのが大きな魅力です。
集計処理の応用サンプル
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は絶対に忘れません!いろんな集計に活用してみます!」