Kazuki.io

プログラミングやITガジェットなどの備忘録だよ。人の役に立てばいいな。

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);

結果
f:id:kazukisaito:20190122194846p:plain

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);

結果
f:id:kazukisaito:20190122194901p:plain

GroupByのラムダ式内に匿名クラスを返すように書いている。(new {c.Date.Year, c.Date.Month}の部分)
GroupByするキーが複数ある場合はこのように匿名クラスをキーとする。