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に対して処理させています。