C#のLINQでグループ化と集計!GroupByとCountを初心者向けに解説
生徒
「C#のLINQでデータをまとめたり数えたりすることはできますか?」
先生
「はい、できますよ。LINQにはGroupByでグループ化、Countで数を数える便利な機能があります。」
生徒
「例えば、同じ種類ごとに分けて集計する、みたいなことですか?」
先生
「そうです!身近な例で言うと、クラスの生徒を『出席番号ごと』や『好きな科目ごと』にまとめて数えるイメージですね。」
1. LINQのGroupByとは?
C#のLINQにある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でグループごとの数を数える
次に、グループごとに「何個あるか」を数えてみましょう。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の強みです。