おそくなりましたが、今年もよろしくお願いします。
今年の目標は「去年のエントリ数を超える」こと。2014年は5本だったようなので、達成できそうな目標にしてみました。
一発目のエントリは、「GroupBy」をテーマにしてみます。非常に強力なLINQのメソッドですが、なかなか使う機会が少ない人も多いのではないかと思います。
「GroupBy」メソッドは、SQLを触ったことのある人なら「group by」句をイメージしてもらうとほぼ間違いなしで、つまりは「コレクション内の各要素を、ある条件でグループ分けする」メソッドです。ぱっと見面倒そうですが、使い方はいたってシンプルです。
サンプルを書いてみましょう。
- データメンバとして、日付(Date)と売上額(Amount)を持つSalesクラスがあります。
- Salesクラスは、ある指定期間の日別の売上額を列挙するEnumerate静的メソッドを持ちます。
- ここで、上記Salesクラスを使い、ある年(ここでは2014年)の曜日別の売り上げの総合計、平均値、中間値を算出します。
この処理は以下のコードになります。
static void ShowGroupedAmounts() { var from = new DateTime(2014, 1, 1); var to = new DateTime(2014, 12, 31); var group = Sales.Enumerate(from, to) .GroupBy(s => s.Date.DayOfWeek) .OrderBy(g => g.Key); Console.WriteLine("DayOfWeak,Total Amount,Average,Median"); foreach (var g in group) { var cnt = g.Count(); Console.WriteLine( "{0},{1},{2},{3}", g.Key, g.Sum(s => s.Amount), Math.Round(g.Average(s => s.Amount), 1), g.OrderBy(s => s.Amount).Skip(cnt / 2).First().Amount); } }
非常にシンプルなコードで、キー(ここでは曜日)ごとにグループ化できていると思います。なお、GroupByメソッドの戻り値は以下の形態になります。
IEnumerable<IGrouping<DayOfWeak, Sales>>
IGroupingは、IEnumerable<T>にキー情報を加えたもの。と考えればOKです。
0 件のコメント:
コメントを投稿