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で果物のリストを種類ごとにグループ化するサンプルコードを見てみましょう。
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でグループごとの数を数える
次に、グループごとに「何個あるか」を数えてみましょう。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
このように、GroupByとCountを組み合わせると、種類ごとの数を簡単に集計できます。
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は絶対に忘れません!いろんな集計に活用してみます!」