C#ライブラリリファレンス - データの集合をグループ化する
Enumerable静的クラスのGroupBy拡張メソッドを使用すれば、データの集合をグループ化することができます。
日常でたとえると
分析するために顧客ごとに書類を纏める。
使用に適した状況
何らかのデータを基準にして、関連するデータを纏めたい場合。例えば、商品別の売上データを見たい時などが該当します。
サンプル
/*----------------------------------------------------
*
* データの集合をグループ化する
*
----------------------------------------------------*/
using System;
using System.Linq;
class Sample
{
class SalesDetails
{
public DateTime Date { get; set; }
public string Name { get; set; }
public int Count { get; set; }
public SalesDetails(
DateTime date, string name, int count )
{
this.Date = date;
this.Name = name;
this.Count = count;
}
public override string ToString( )
{
return String.Format(
"売上日:{0} 商品名「{1}」 数量={2}",
this.Date, this.Name, this.Count );
}
}
static void Main( )
{
//データソースを用意
var values = new[ ] {
new SalesDetails (
new DateTime( 2014, 4, 10) ,
"釘",
2 ) ,
new SalesDetails (
new DateTime( 2014, 6, 8) ,
"金槌",
1 ) ,
new SalesDetails (
new DateTime( 2014, 6, 9 )
, "釘",
1 )
};
Console.WriteLine( "データ" );
foreach ( var v in values )
Console.WriteLine( "{0} ", v );
Console.WriteLine( Environment.NewLine );
//データをグループ化
Console.WriteLine(
"データを名前でグループ化します・・・" );
var results = values.GroupBy( x => x.Name );
foreach ( var x in results ) {
foreach ( var y in x )
Console.WriteLine( "{0} ", y );
Console.WriteLine(); //グループを分ける
}
Console.WriteLine( Environment.NewLine );
//クエリ式でデータをグループ化
Console.WriteLine( "クエリ式を使用します・・・" );
var qr = from v in values
group v by v.Name;
foreach ( var x in qr ) {
foreach ( var y in x )
Console.WriteLine( "{0} ", y );
Console.WriteLine();
}
Console.WriteLine( Environment.NewLine );
//終了
Console.WriteLine( "サンプル終了。" );
Console.ReadLine();
}
}
名前空間
System.Linq名前空間を参照してください。
解説
昨今は、ビッグデータを分析する機会が増えました。その膨大なデータを分析する方法は色々ありますが、基本的なデータの見方は、一つの基準でデータをグルーピングする事です。
例えば、商品ごとにデータを纏めると、商品の売れ行きや、商品の製造工程などが把握できます。他にも、顧客別にデータをグルーピング化して、好む商品を割り出したり、著作者別に出版した本を把握したりできます。
このように、グルーピングはデータを扱う上で一般的な処理なので、GroupBy拡張メソッドが用意されています。データを扱う上で避けては通れない重要なメソッドといえるでしょう。