いつものごとく
テスト用の高級果物クラスです。
【C#】
private class Fruit { public string Name { get; set; } public string Rank { get; set; } public decimal Price { get; set; } }【VB#】
Private Class Fruit Public Property Name As String Public Property Rank As String Public Property Price As Decimal End Classテストデータを作成します。
【C#】
var fruits = new List<Fruit>() { new Fruit(){Name = "りんご", Rank = "A" , Price = 1000 }, new Fruit(){Name = "みかん", Rank = "A" , Price = 600 }, new Fruit(){Name = "ぶどう", Rank = "B" , Price = 1200 }, new Fruit(){Name = "りんご", Rank = "B" , Price = 800 }, new Fruit(){Name = "みかん", Rank = "A" , Price = 500 } };【VB】
Dim fruits = New List(Of Fruit)() From { New Fruit() With {.Name = "りんご", .Rank = "A", .Price = 1000}, New Fruit() With {.Name = "みかん", .Rank = "A", .Price = 600}, New Fruit() With {.Name = "ぶどう", .Rank = "B", .Price = 1200}, New Fruit() With {.Name = "りんご", .Rank = "B", .Price = 800}, New Fruit() With {.Name = "みかん", .Rank = "A", .Price = 500} }果物名別の合計金額を集計します。
まずはGroupByで名前でグループ化します。
つづいてグループ化した各アイテムに対してAgreegateで金額を集計します。
Agreegateの第1引数がseed(種)で、第二引数でseedに対して各アイテムのPriceを加算していきます。
【C#】
var nameSumPriceList = fruits .GroupBy(itm => itm.Name) .Select(grp => new { Name = grp.Key, SumPrice = grp.Aggregate(0m, (seedSum, curItm) => seedSum += curItm.Price) }); //--出力-- // りんご 1800 // みかん 1100 // ぶどう 1200 nameSumPriceList.ToList().ForEach(itm => { Console.WriteLine(string.Format("{0} {1}", itm.Name, itm.SumPrice)); });【VB】
Dim nameSumPriceList = fruits _ .GroupBy(Function(itm) itm.Name) _ .Select(Function(grp) _ New With { .Name = grp.Key, .SumPrice = grp.Aggregate(0D, Function(seedSum, curItm) seedSum + curItm.Price) }) '--出力-- ' りんご 1800 ' みかん 1100 ' ぶどう 1200 nameSumPriceList.ToList().ForEach(Sub(itm) _ Console.WriteLine(String.Format("{0} {1}", itm.Name, itm.SumPrice)))
次は果物名別ランク別の最大金額を集計します。
【C#】
//名前別ランク別の最大金額 var namePriceList = fruits .GroupBy(itm => new { itm.Name, itm.Rank }) .Select(grp => new { Name = grp.Key.Name, Rank = grp.Key.Rank, MaxPrice = grp.Aggregate(0m, (seedMax, curItm) => (seedMax > curItm.Price) ? seedMax : curItm.Price) }); //--出力 // りんご A 1000 // みかん A 600 // ぶどう B 1200 // りんご B 800 namePriceList.ToList().ForEach(itm => { Console.WriteLine(string.Format("{0} {1} {2}", itm.Name, itm.Rank, itm.MaxPrice)); });【VB】
GroupByでグループ化のキーに匿名クラスを使用する際は、キーに使用するプロパティの前にKeyキーワードを付けます。
'名前ランク別の最大金額 Dim namePriceList = fruits _ .GroupBy(Function(itm) New With {Key itm.Name, Key itm.Rank}) _ .Select(Function(grp) _ New With { .Name = grp.Key.Name, .Rank = grp.Key.Rank, .MaxPrice = grp.Aggregate(0D, Function(seedMax, curItm) If(seedMax > curItm.Price, seedMax, curItm.Price)) }) '--出力 ' りんご A 1000 ' みかん A 600 ' ぶどう B 1200 ' りんご B 800 namePriceList.ToList().ForEach( Sub(itm) Console.WriteLine(String.Format("{0} {1} {2}", itm.Name, itm.Rank, itm.MaxPrice)))
0 件のコメント:
コメントを投稿