[LINQ][C#] Groupでデータをグループ化する

[LINQ][C#] Groupでデータをグループ化する

1つのキーでグループ化

LINQを使ってデータを特定のキー列でグループ化するにはGroupByを使います。
仮にBookというクラスを定義します。

class Book
{
    public string Title { get; set; }
    public string Author { get; set; }
    public int Pages { get; set; }
    public int Category { get; set; }

    public override string ToString()
    {
        return string.Format("Title={0}, Pages={1}", Title, Pages);
    }
}

Bookのリストをもとデータ、Authorをキーとし、グループ化します。

// データ
var data = new List<Book>()
{
    new Book { Title = "タイトル1", Pages = 100, Author = "太郎", Category = 1},
    new Book { Title = "タイトル2", Pages = 80, Author = "次郎", Category = 1},
    new Book { Title = "タイトル3", Pages = 150, Author = "太郎", Category = 2},
    new Book { Title = "タイトル4", Pages = 130, Author = "次郎", Category = 3},
    new Book { Title = "タイトル5", Pages = 200, Author = "三郎", Category = 2},
};

// Authorでグループ化
var result = data.GroupBy(d => d.Author);

// 確認
foreach (var group in result)
{
    // キー項目(Author)
    Console.WriteLine(group.Key);
    // データ
    foreach (var item in group)
    {
        Console.WriteLine(item.ToString());
    }
}

グループ化の結果(GroupByの戻り値:result)の型は、IEnumerable<IGrouping<K, S>>です。KがキーでSがグループ化された要素です。この場合、KがAuthor、SがBookとなります。

上の処理の内容は、グループ化されたデータをループして各要素を取り出し、キーごとに正しくグループ化されているかを確認しています。

複合キーでグループ化

複合キー(複数のキー)でグループ化する場合、グループキーをオブジェクトとして指定します。

// データ
var data = new List<Book>()
{
    new Book { Title = "タイトル1", Pages = 100, Author = "太郎", Category = 1},
    new Book { Title = "タイトル2", Pages = 80, Author = "次郎", Category = 1},
    new Book { Title = "タイトル3", Pages = 150, Author = "太郎", Category = 2},
    new Book { Title = "タイトル4", Pages = 130, Author = "次郎", Category = 3},
    new Book { Title = "タイトル5", Pages = 200, Author = "三郎", Category = 2},
    new Book { Title = "タイトル6", Pages = 100, Author = "太郎", Category = 1},
    new Book { Title = "タイトル7", Pages = 123, Author = "太郎", Category = 1},
    new Book { Title = "タイトル8", Pages = 220, Author = "次郎", Category = 2},
    new Book { Title = "タイトル9", Pages = 500, Author = "太郎", Category = 2},
    new Book { Title = "タイトル10", Pages = 330, Author = "次郎", Category = 3},
};

// Author, Categoryでグループ化
var result = data.GroupBy(d => new {
    Author = d.Author, Category = d.Category
});

// 確認
foreach (var group in result)
{
    // キー項目
    Console.WriteLine(group.Key);
    // データ
    foreach (var item in group)
    {
        Console.WriteLine(item.ToString());
    }
}

GroupByのキーで匿名型のクラスを指定しています。そこでAuthorとCategoryをキーの要素としています。
これで複合キーでのグループ化ができました。

Linqカテゴリの最新記事