C# の LINQ を使うと、データをグループ化したり、合計や平均などの集計を簡潔に記述できます。特に GroupBy
と組み合わせることで、SQL のような集計処理をコード内で実現できます。本記事では GroupBy
の基本から、Sum
・Count
・Average
などの集約関数の使い方を紹介します。
サンプルデータ
public class Product
{
public string Category { get; set; } = "";
public string Name { get; set; } = "";
public int Price { get; set; }
}
var products = new List<Product>
{
new Product { Category = "食品", Name = "りんご", Price = 100 },
new Product { Category = "食品", Name = "パン", Price = 200 },
new Product { Category = "飲料", Name = "コーヒー", Price = 150 },
new Product { Category = "飲料", Name = "紅茶", Price = 120 },
new Product { Category = "雑貨", Name = "ノート", Price = 300 },
};
GroupByの基本
カテゴリごとに商品をグルーピングする例です。
var groups = products.GroupBy(p => p.Category);
foreach (var group in groups)
{
Console.WriteLine($"カテゴリ: {group.Key}");
foreach (var item in group)
{
Console.WriteLine($" - {item.Name} ({item.Price}円)");
}
}
出力例:
カテゴリ: 食品
- りんご (100円)
- パン (200円)
カテゴリ: 飲料
- コーヒー (150円)
- 紅茶 (120円)
カテゴリ: 雑貨
- ノート (300円)
GroupByとSumで合計を計算
グループごとの合計金額を計算します。
var categorySums = products
.GroupBy(p => p.Category)
.Select(g => new
{
Category = g.Key,
Total = g.Sum(p => p.Price)
});
foreach (var item in categorySums)
{
Console.WriteLine($"{item.Category} の合計金額: {item.Total}円");
}
Countで件数を取得
グループごとの件数を取得できます。
var categoryCounts = products
.GroupBy(p => p.Category)
.Select(g => new
{
Category = g.Key,
Count = g.Count()
});
foreach (var item in categoryCounts)
{
Console.WriteLine($"{item.Category} の商品数: {item.Count}");
}
Averageで平均を計算
グループごとの平均価格を求める例です。
var categoryAverages = products
.GroupBy(p => p.Category)
.Select(g => new
{
Category = g.Key,
Average = g.Average(p => p.Price)
});
foreach (var item in categoryAverages)
{
Console.WriteLine($"{item.Category} の平均価格: {item.Average:F1}円");
}
まとめ
LINQ の GroupBy
と集約関数を組み合わせると、データのグルーピングと集計を簡潔に表現できます。
GroupBy
… 指定したキーでデータをグループ化Sum
… 合計を算出Count
… 件数を算出Average
… 平均を算出
SQL のような集計処理を C# のコード内で自然に記述できるため、データ処理の効率が大幅に向上します。