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をキーの要素としています。
これで複合キーでのグループ化ができました。
コメントを書く