今回のテーマ
こんばんは、サルモリです。
今回のテーマは下記の記事について書いていきます。
今回のテーマ
グループ化したリストや配列から最大値、最小値、合計、平均値、件数を求める方法
今回の記事も理解するのが難しいと思いますが、Linqの応用編としてグループ化したリストや配列に対して、最大値などを求めていきたいと思います。
下記の記事でGroupbyについて解説しています。
CHECK
-
【C# sharp Linq】GroupByを使ってグループ化しよう。
ChatGPTのAPIを使わずに自動化することが可能です。 下記の本を読めば、ChatGPT4でも料金掛からずに自動化できます!KindleUnlimited会員であれば無料で読めます。 今回のテーマ ...
続きを見る
Linqの記事は下記にまとめました。
他のLinqの記事についてはこちら
今回使用するクラス
今回は下記のクラスを使用します。何回も使用しているロボットクラスです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
class Robot { string name, color, maker; int strength; public Robot(string _name, string _color, int _strength, string _maker) { name = _name; color = _color; strength = _strength; maker = _maker; } public String Name { get { return name; } } public String Color { get { return color; } } public int Strength { get { return strength; } } public String Maker { get { return maker; } } } |
グループ化のおさらい
まずはグループ化について、簡単におさらいしましょう。グループ化するメソッドは下記の二つがあります。
グループ化メソッド
- Groupby
- ToLookup
基本的にどちらを使用してもいいのですが、ToLookupを使用すると、Directoryのように直接キーを入力して要素を呼び出すことが可能です。
今回はGroupbyを使用するので、サンプルプログラムを下記に記述します。
色別にロボットを出力する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp2 { class Program { static void Main(string[] args) { List<Robot> robotlist = new List<Robot>(); robotlist.Add(new Robot("Rockman", "Blue", 4,"Dr Light")); robotlist.Add(new Robot("Fireman", "Red", 3,"Dr Wily")); robotlist.Add(new Robot("Iceman", "Blue", 3, "Dr Wily")); robotlist.Add(new Robot("Elecman", "Yellow", 4, "Dr Wily")); robotlist.Add(new Robot("Roll", "Pink", 1, "Dr Light")); robotlist.Add(new Robot("Airman", "Blue", 2, "Dr Wily")); robotlist.Add(new Robot("Woodman", "Green", 2, "Dr Wily")); robotlist.Add(new Robot("Quickman", "Red", 5, "Dr Wily")); robotlist.Add(new Robot("Shadowman", "Blue", 5, "Dr Wily")); robotlist.Add(new Robot("Bubbleman", "Green", 3, "Dr Wily")); var grouprobotlist = robotlist.GroupBy(x => x.Color); foreach(var robotcolorlist in grouprobotlist) { foreach(var robot in robotcolorlist) { Console.WriteLine("Color:" + robot.Color + " Name:" + robot.Name); } Console.WriteLine("-------------------------------------"); } } } } |
result
Color:Blue Name:Rockman
Color:Blue Name:Iceman
Color:Blue Name:Airman
Color:Blue Name:Shadowman
-------------------------------------
Color:Red Name:Fireman
Color:Red Name:Quickman
-------------------------------------
Color:Yellow Name:Elecman
-------------------------------------
Color:Pink Name:Roll
-------------------------------------
Color:Green Name:Woodman
Color:Green Name:Bubbleman
-------------------------------------
色別にグループ化されていますね。これからグループ化した各リストの最大値、最小値、合計、平均を求めていきます。
グループ化した各リストから最大値を求める。
まずは各色リストから最大の強さを取り出す方法を記述していきます。最大値を求めるのでMaxを使用します。
それでは、早速ソースコードを書いていきます。
色別の各リストから最大の強さを求める
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp2 { class Program { static void Main(string[] args) { List<Robot> robotlist = new List<Robot>(); robotlist.Add(new Robot("Rockman", "Blue", 4,"Dr Light")); robotlist.Add(new Robot("Fireman", "Red", 3,"Dr Wily")); robotlist.Add(new Robot("Iceman", "Blue", 3, "Dr Wily")); robotlist.Add(new Robot("Elecman", "Yellow", 4, "Dr Wily")); robotlist.Add(new Robot("Roll", "Pink", 1, "Dr Light")); robotlist.Add(new Robot("Airman", "Blue", 2, "Dr Wily")); robotlist.Add(new Robot("Woodman", "Green", 2, "Dr Wily")); robotlist.Add(new Robot("Quickman", "Red", 5, "Dr Wily")); robotlist.Add(new Robot("Shadowman", "Blue", 5, "Dr Wily")); robotlist.Add(new Robot("Bubbleman", "Green", 3, "Dr Wily")); var groupcolorlist = robotlist.GroupBy(x => x.Color).Select(x => (x.Key,x.Max(x => x.Strength))).ToList(); foreach (var item in groupcolorlist) { Console.WriteLine("Color:" + item.Key + " MaxStrength:" + item.Item2); } } } } |
result
Color:Blue MaxStrength:5
Color:Red MaxStrength:5
Color:Yellow MaxStrength:4
Color:Pink MaxStrength:1
Color:Green MaxStrength:3
各リストから最大の強さを求めることができています。
今回の例ではSelectメソッドで色分けした各リストを参照し、最大値を求めています。
このやり方さえ覚えれば、他の最小値、合計、平均も同じように求めることが出来ます。
グループ化した各リストから最小値を求める。
次は最小値を求めます。基本的に同じですが、作成者別リストから強さの最小値を求めてみましょう。
作成者別の各リストから最小の強さを出力する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp2 { class Program { static void Main(string[] args) { List<Robot> robotlist = new List<Robot>(); robotlist.Add(new Robot("Rockman", "Blue", 4,"Dr Light")); robotlist.Add(new Robot("Fireman", "Red", 3,"Dr Wily")); robotlist.Add(new Robot("Iceman", "Blue", 3, "Dr Wily")); robotlist.Add(new Robot("Elecman", "Yellow", 4, "Dr Wily")); robotlist.Add(new Robot("Roll", "Pink", 1, "Dr Light")); robotlist.Add(new Robot("Airman", "Blue", 2, "Dr Wily")); robotlist.Add(new Robot("Woodman", "Green", 2, "Dr Wily")); robotlist.Add(new Robot("Quickman", "Red", 5, "Dr Wily")); robotlist.Add(new Robot("Shadowman", "Blue", 5, "Dr Wily")); robotlist.Add(new Robot("Bubbleman", "Green", 3, "Dr Wily")); var groupmakerlist = robotlist.GroupBy(x => x.Maker).Select(x => (x.Key,x.Min(x => x.Strength))).ToList(); foreach (var item in groupmakerlist) { Console.WriteLine("Maker:" + item.Key + " MinStrength:" + item.Item2); } } } } |
result
Maker:Dr Light MinStrength:1
Maker:Dr Wily MinStrength:2
最小値もSelectメソッドで指定し、Minを使用することで出力できていますね。
グループ化した各リストから合計を求める。
次は、強さの合計を求めてみましょう。
色別の各リストから強さを合計した値を出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp2 { class Program { static void Main(string[] args) { List<Robot> robotlist = new List<Robot>(); robotlist.Add(new Robot("Rockman", "Blue", 4,"Dr Light")); robotlist.Add(new Robot("Fireman", "Red", 3,"Dr Wily")); robotlist.Add(new Robot("Iceman", "Blue", 3, "Dr Wily")); robotlist.Add(new Robot("Elecman", "Yellow", 4, "Dr Wily")); robotlist.Add(new Robot("Roll", "Pink", 1, "Dr Light")); robotlist.Add(new Robot("Airman", "Blue", 2, "Dr Wily")); robotlist.Add(new Robot("Woodman", "Green", 2, "Dr Wily")); robotlist.Add(new Robot("Quickman", "Red", 5, "Dr Wily")); robotlist.Add(new Robot("Shadowman", "Blue", 5, "Dr Wily")); robotlist.Add(new Robot("Bubbleman", "Green", 3, "Dr Wily")); var groupcolorlist = robotlist.GroupBy(x => x.Color).Select(x => (x.Key,x.Sum(x => x.Strength))).ToList(); foreach (var item in groupcolorlist) { Console.WriteLine("Color:" + item.Key + " SumStrength:" + item.Item2); } } } } |
result
Color:Blue SumStrength:14
Color:Red SumStrength:8
Color:Yellow SumStrength:4
Color:Pink SumStrength:1
Color:Green SumStrength:5
基本的な考え方は同じですね。
グループ化した各リストから平均値を求める。
強さの平均値を求めてみましょう。
色別の各リストから強さを平均した値を出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp2 { class Program { static void Main(string[] args) { List<Robot> robotlist = new List<Robot>(); robotlist.Add(new Robot("Rockman", "Blue", 4,"Dr Light")); robotlist.Add(new Robot("Fireman", "Red", 3,"Dr Wily")); robotlist.Add(new Robot("Iceman", "Blue", 3, "Dr Wily")); robotlist.Add(new Robot("Elecman", "Yellow", 4, "Dr Wily")); robotlist.Add(new Robot("Roll", "Pink", 1, "Dr Light")); robotlist.Add(new Robot("Airman", "Blue", 2, "Dr Wily")); robotlist.Add(new Robot("Woodman", "Green", 2, "Dr Wily")); robotlist.Add(new Robot("Quickman", "Red", 5, "Dr Wily")); robotlist.Add(new Robot("Shadowman", "Blue", 5, "Dr Wily")); robotlist.Add(new Robot("Bubbleman", "Green", 3, "Dr Wily")); var groupcolorlist = robotlist.GroupBy(x => x.Color).Select(x => (x.Key,x.Average(x => x.Strength))).ToList(); foreach (var item in groupcolorlist) { Console.WriteLine("Color:" + item.Key + " AverageStrength:" + item.Item2); } } } } |
result
Color:Blue AverageStrength:3.5
Color:Red AverageStrength:4
Color:Yellow AverageStrength:4
Color:Pink AverageStrength:1
Color:Green AverageStrength:2.5
平均も求めることができました。
グループ化した各リストの件数を求める。
最後に各リストの件数を求めてみましょう。
色別の各リストの件数を出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; using System.Collections.Generic; using System.Linq; namespace ConsoleApp2 { class Program { static void Main(string[] args) { List<Robot> robotlist = new List<Robot>(); robotlist.Add(new Robot("Rockman", "Blue", 4,"Dr Light")); robotlist.Add(new Robot("Fireman", "Red", 3,"Dr Wily")); robotlist.Add(new Robot("Iceman", "Blue", 3, "Dr Wily")); robotlist.Add(new Robot("Elecman", "Yellow", 4, "Dr Wily")); robotlist.Add(new Robot("Roll", "Pink", 1, "Dr Light")); robotlist.Add(new Robot("Airman", "Blue", 2, "Dr Wily")); robotlist.Add(new Robot("Woodman", "Green", 2, "Dr Wily")); robotlist.Add(new Robot("Quickman", "Red", 5, "Dr Wily")); robotlist.Add(new Robot("Shadowman", "Blue", 5, "Dr Wily")); robotlist.Add(new Robot("Bubbleman", "Green", 3, "Dr Wily")); var groupcolorlist = robotlist.GroupBy(x => x.Color).Select(x => (x.Key,x.Count())).ToList(); foreach (var item in groupcolorlist) { Console.WriteLine("Color:" + item.Key + " Count:" + item.Item2); } } } } |
result
Color:Blue Count:4
Color:Red Count:2
Color:Yellow Count:1
Color:Pink Count:1
Color:Green Count:2
各リストの件数を求められていますね。
まとめ
今回は各グループの最大値、最小値、合計、平均、件数を求めるソースコードを書いていきました。
Linqでのグループ化について、より深く学ぶことが出来ればいいと思っています。
記事を最後まで見て頂き、ありがとうございました。
こちらもCHECK
-
【C# sharp Linq】Groupbyメソッドのグループ化項目を複数指定する方法
ChatGPTのAPIを使わずに自動化することが可能です。 下記の本を読めば、ChatGPT4でも料金掛からずに自動化できます!KindleUnlimited会員であれば無料で読めます。 今回のテーマ ...
続きを見る
他のLinqの記事についてはこちら