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で列挙できるような状態になります。