group by句によるグループ化

プログラミングC# 第6版 8.3.4


データをグループごとにまとめます。

以下実行例

using System;
using System.Linq;

class Foo {
    public int id;
    public string name;
}

class Program {
    static void Main() {
        Foo[] fooList = new Foo[] {
            new Foo() { id = 2 , name = "foo1" },
            new Foo() { id = 2 , name = "foo2" },
            new Foo() { id = 2 , name = "foo3" },
            new Foo() { id = 3 , name = "foo4" },
            new Foo() { id = 3 , name = "foo5" },
        };
        
        // idをキーにしてグループ化する
        var ret = from foo in fooList
                  group foo by foo.id;
        
        // まずはid毎のループ
        foreach(var item in ret) {
            Console.WriteLine("key(id)={0}",item.Key);
            
            // id毎にまとめられたFooのデータでループ
            foreach(var foo in item) {
                Console.WriteLine("id={0} name={1}",foo.id,foo.name);
            }
        }
    }
}
$ main
key(id)=2
id=2 name=foo1
id=2 name=foo2
id=2 name=foo3
key(id)=3
id=3 name=foo4
id=3 name=foo5

特定のキーでグループ化するという感じですね。

さらにここからgroup〜intoを利用して、グループ化されたデータを対象に処理を続けることもできます。

class Program {
    static void Main() {
        Foo[] fooList = new Foo[] {
            new Foo() { id = 2 , name = "foo1" },
            new Foo() { id = 2 , name = "foo2" },
            new Foo() { id = 2 , name = "foo3" },
            new Foo() { id = 3 , name = "foo4" },
            new Foo() { id = 3 , name = "foo5" },
        };
        
        // idをキーにしてグループ化し、グループ化されたtmpに対して処理をする
        var ret = from foo in fooList
                  group foo by foo.id into tmp
                  select tmp.Key; // グループ化したキー(id)のみ返す
        
        // グループ化したidを表示
        foreach(var id in ret) {
            Console.WriteLine("id={0}",id);
        }
    }
}
$ main
id=2
id=3

処理自体に意味はありません。intoグループ化された値をtmpに一時変数として格納し、selectでtmpに対して処理させています。