本文へスキップ
BecomeCoder

C#文法コース · 第5章 LINQ · レッスン41

グルーピング(GroupBy)

ブラウザで完結

導入

「部署ごとの人数」「カテゴリ別の売上」——共通のキーで要素をまとめるのがGroupByです。集計と組み合わせると強力な分析ができます。

図解

flowchart TB
    IN["果物リスト<br/>りんご・みかん・りんご・ぶどう・みかん"] --> G["GroupBy(名前)"]
    G --> G1["りんご: 2個"]
    G --> G2["みかん: 2個"]
    G --> G3["ぶどう: 1個"]

サンプル

string[] fruits = { "りんご", "みかん", "りんご", "ぶどう", "みかん" };

// GroupBy: 同じ値ごとにグループ化する
var groups = fruits.GroupBy(f => f);

foreach (var group in groups)
{
    // group.Key はグループの代表値、group はそのグループの要素の集まり
    Console.WriteLine($"{group.Key}: {group.Count()}個");
}
// りんご: 2個 / みかん: 2個 / ぶどう: 1個
  • GroupBy(要素 => キー)で同じキーごとにまとめる
  • 各グループ.Key(キー)と、その要素の集まりを持つ
  • .Count().Sum()と組み合わせて「グループごとの集計」ができる

演習

int[] numbers = { 1, 2, 3, 4, 5, 6 };

// TODO: GroupBy で偶数・奇数に分け、"奇数: 3個" と "偶数: 3個" を1行ずつ出力してください
//       ヒント: キーは n % 2 == 0 ? "偶数" : "奇数"
___
  • 期待される出力: 奇数: 3個 偶数: 3個(2行。グループは最初に登場したキーの順に並ぶ——先頭の1が奇数なので奇数が先)
ヒント1を見る

numbers.GroupBy(n => n % 2 == 0 ? "偶数" : "奇数")

ヒント2を見る

foreach (var g in numbers.GroupBy(n => n % 2 == 0 ? "偶数" : "奇数")) Console.WriteLine($"{g.Key}: {g.Count()}個");

まとめ

  • GroupBy(要素 => キー)で同じキーごとにグループ化
  • 各グループは.Keyと要素の集まりを持つ
  • 集計メソッドと組み合わせて「カテゴリ別集計」を実現

次回: 存在確認と、LINQの重要な性質「遅延実行」です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。