佐々木屋

技術的なことから趣味まで色々書きます

GroupByメソッド①

GroupByメソッドはLINQの中では少し特殊(私だけか?)で、単純なlistやarrayのようなコレクションでは利用しません。コレクションコレクションの中にコレクションが格納されているような場合の集計に非常に便利な機能となります。複雑な集計を簡単に書くことができるのです。

データテーブルのような階層構造を持ったコレクションの小計・合計を求めたりも簡単に出来ます。

以下のような状態を保持するようなクラスと、このクラスを要素にもつようなコレクションがあります。一種のテーブルのような構造です。

public class Uriage {
    public string KaisyaCD { get; set; }
    public string SyainCD { get; set; }
    public int UriageSu { get; set; }
    public int UriageKingaku { get; set; }
}
Public Class Uriage
    Public Property KaisyaCD() As String
    Public Property SyainCD() As String
    Public Property UriageSu() As Integer
    Public Property UriageKingaku() As Integer
End Class

社員番号(SyainCD)で集計します。GroupByメソッドは引数にラムダ式でグループ分けのKeyを指定します。

List<Uriage> lst = new List<Uriage>() {
            new Uriage{KaisyaCD="1",SyainCD = "25",Su = 5, Kingaku=3000},
            new Uriage{KaisyaCD="1",SyainCD = "31",Su = 10, Kingaku=4000},
            new Uriage{KaisyaCD="1",SyainCD = "31",Su = 98, Kingaku=12800},
            new Uriage{KaisyaCD="1",SyainCD = "25",Su  = 11, Kingaku=250}};

var res = lst.GroupBy(x => x.SyainCD);
foreach(var r in res) {
    Console.WriteLine(r.Key);
}
Dim lst As New List(Of Uriage) From {
            New Uriage With {.KaisyaCD = "1", .SyainCD = "25", .Su  = 5, .Kingaku = 3000},
            New Uriage With {.KaisyaCD = "1", .SyainCD = "31", .Su  = 10, .Kingaku= 4000},
            New Uriage With {.KaisyaCD = "1", .SyainCD = "31", .Su  = 98, .Kingaku= 12800},
            New Uriage With {.KaisyaCD = "1", .SyainCD = "25", .Su  = 11, .Kingaku= 250}}
Dim res = lst.GroupBy(Function(x) x.SyainCD)
For Each r In res
    Console.WriteLine(r.Key)
Next
25
31


このように集計後はIEnumerableで列挙できるような状態になります。