C# Linq GroupBy Sum
サンプルクラス
Data.cs
public class Data { public int Id { get; set; } public string Name { get; set; } public DateTime Date { get; set; } public int Value { get; set; } }
テストデータの挿入
Main.cs
using System; using System.Collections.Generic; static void Main(string[] args) { var dataList = new List<Data>(); dataList.Add(new Data() { Id = 1, Name = "A", Date = new DateTime(2018, 1, 1, 18, 33, 0), Value = 90 }); dataList.Add(new Data() { Id = 1, Name = "B", Date = new DateTime(2018, 1, 2, 19, 2, 0), Value = 2 }); dataList.Add(new Data() { Id = 1, Name = "C", Date = new DateTime(2018, 1, 3, 2, 48, 0), Value = 54 }); dataList.Add(new Data() { Id = 2, Name = "A", Date = new DateTime(2019, 1, 21, 18, 9, 0), Value = 33 }); dataList.Add(new Data() { Id = 2, Name = "B", Date = new DateTime(2019, 2, 1, 12, 1, 0), Value = 88 }); dataList.Add(new Data() { Id = 2, Name = "B", Date = new DateTime(2019, 2, 5, 14, 15, 0), Value = 65 }); dataList.Add(new Data() { Id = 2, Name = "D", Date = new DateTime(2019, 2, 11, 13, 40, 0), Value = 9 }); }
これで変数 dataListに7つのオブジェクトが格納された。
一つの要素でGroupByして、SumでValueの合計値を取得する
ここではIdでGroupByして、ValueをSumしてみる。
Main.cs
var data1 = dataList.GroupBy(c => c.Id) .Select(c => new { Key = c.Key, ValueSum = c.Sum(x => x.Value) }); foreach (var d in data1) Console.WriteLine("Key={0} ValueSum={1}", d.Key, d.ValueSum);
結果
Sumのなかでcとは別にxという変数を使用しているのに注意。
日付の年と月でGroupByして、SumでValueの合計値を取得する
ここではDateのYearとMonthの2つでGroupByして、ValueをSumしてみる。
複合キーのパターン。
Main.cs
var data2 = dataList.GroupBy(c => new {c.Date.Year, c.Date.Month }).Select(c => new { c.Key.Year, c.Key.Month, ValueSum = c.Sum(x => x.Value) }); foreach (var d in data2) Console.WriteLine("Key1={0}, Key2={1}, ValueSum={1}", d.Year, d.Month, d.ValueSum);
結果
GroupByのラムダ式内に匿名クラスを返すように書いている。(new {c.Date.Year, c.Date.Month}の部分)
GroupByするキーが複数ある場合はこのように匿名クラスをキーとする。