Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

C#辞典

  1. トップページ
  2. C#辞典
  3. Enumerable.GroupBy()

Enumerable.GroupBy()

シーケンスの要素をキーごとにグループ化する LINQ の拡張メソッドです。キー引き で高速アクセスできる『ToLookup()』も合わせて解説します。

構文
using System.Linq;

// キーセレクターでグループ化します。
IEnumerable<IGrouping<TKey, T>> groups = source.GroupBy(x => キー);

// キーと値を別々に指定してグループ化します。
IEnumerable<IGrouping<TKey, TVal>> groups2 = source.GroupBy(x => キー, x => 値);

// 辞書のようにキーで直接アクセスできる Lookup を作成します。
ILookup<TKey, T> lookup = source.ToLookup(x => キー);
メソッド一覧
メソッド概要
GroupBy(keySelector)キーセレクターでグループ化した『IGrouping』の列挙を返します。
GroupBy(keySelector, elementSelector)グループ内の要素も変換してグループ化します。
GroupBy(keySelector, resultSelector)各グループをまとめて変換した結果を返します。
ToLookup(keySelector)即時評価でキーと要素のコレクションをマッピングした『Lookup』を返します。
サンプルコード
using System;
using System.Collections.Generic;
using System.Linq;

var products = new List<(string Name, string Category, int Price)>
{
    ("りんご",   "果物", 150),
    ("みかん",   "果物", 80),
    ("にんじん", "野菜", 100),
    ("バナナ",   "果物", 120),
    ("キャベツ", "野菜", 200),
};

// カテゴリーでグループ化します。
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}円");
}

// グループ内の要素数と合計を集計します。
var summary = products.GroupBy(p => p.Category)
                       .Select(g => new
                       {
                           Category = g.Key,
                           Count    = g.Count(),
                           Total    = g.Sum(x => x.Price),
                       });
foreach (var s in summary)
    Console.WriteLine($"{s.Category}: {s.Count}件, 合計 {s.Total}円");

// ToLookup でキーを指定して素早くアクセスします(即時評価)。
ILookup<string, string> lookup = products.ToLookup(p => p.Category, p => p.Name);
foreach (var name in lookup["果物"])
    Console.WriteLine(name);
概要

『GroupBy()』は遅延評価で動作し、グループを表す『IGrouping<TKey, TElement>』の列挙を返します。各グループは『Key』プロパティでグループキーを取得でき、そのまま列挙すると要素を取り出せます。

『ToLookup()』は即時評価のため、作成後はキーを指定して複数回参照するのに向いています。『ToLookup()』は存在しないキーにアクセスしても例外を投げず、空のシーケンスを返します。一方、同様に見える『Dictionary』はキーが存在しない場合に例外を投げます。

グループ化した後に並べ替えを行う場合は『Enumerable.OrderBy()』を参照してください。グループごとの集計には『Enumerable.Count() / Sum() / Average()』が役立ちます。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。