今回のテーマ
こんばんは、サルモリです。
今回のテーマは下記の記事について書いていきます。
今回のテーマ
グループ化したリストや配列から特定の要素を取り出す方法
今回は理解するのが難しいと思いますが、Linqの応用編としてグループ化したリストや配列に対して、特定の要素を取り出していきたいと思います。
GroupByメソッドの使い方は下記の記事で解説しています。
CHECK
-
【C# sharp Linq】GroupByを使ってグループ化しよう。
ChatGPTのAPIを使わずに自動化することが可能です。 下記の本を読めば、ChatGPT4でも料金掛からずに自動化できます!KindleUnlimited会員であれば無料で読めます。 今回のテーマ ...
続きを見る
他の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
-------------------------------------
色別にグループ化されていますね。これからグループ化した各リストから指定した条件の要素を指定していきます。
グループ化した各リストから1つの要素を取り出す方法
まずは各リストから1つずつ要素を取り出す方法を記述していきます。1つだけ取り出すには、FirstOrDefaultメソッドを使いましょう。
それでは、早速ソースコードを書いていきます。
色別の各リストから1つずつ要素を取り出す方法
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 |
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).Select(robot => robot.FirstOrDefault()); foreach(var robot in grouprobotlist) { Console.WriteLine("Color:" + robot.Color + " Name:" + robot.Name); Console.WriteLine("-------------------------------------"); } } } } |
result
Color:Blue Name:Rockman
-------------------------------------
Color:Red Name:Fireman
-------------------------------------
Color:Yellow Name:Elecman
-------------------------------------
Color:Pink Name:Roll
-------------------------------------
Color:Green Name:Woodman
-------------------------------------
各リストから1つずつ要素を取り出すことが出来ています。
グループ化を行う時はリスト内にリストが格納されているイメージを持って下さい。
その為、リスト内のリストを参照するためにSelectメソッドを指定することが必要となります。
Selectメソッドを使用せずに、直接FirstOrDefaultメソッドを指定すると、リスト内に格納されているリストを1つ取り出すことになります。
実際にやってみましょう。1番初めに格納したロックマンのリストが出力されます。
Selectメソッドを使用せずにFirstOrDefaultを使用した場合
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 |
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).FirstOrDefault(); foreach(var robot in grouprobotlist) { 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
-------------------------------------
ロックマンが属する青色のリストが取り出せていることが分かります。2つの出力結果を見比べると、Groupbyメソッドの理解がさらに深まるでしょう。
グループ化した各リストから強さが3以上のロボットを出力する
もう1つ例を出していきます。各色別リストから強さが3文字以上のロボットを出力してみましょう。
各リストから強さが3以上のロボットのみ出力
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).Select(x => x.Where(y => y.Strength > 3).Select(x => x)).ToList(); foreach(var robot in grouprobotlist) { foreach (var item in robot) { Console.WriteLine("Color:" + item.Color + " Name:" + item.Name); } Console.WriteLine("-------------------------------------"); } } } } |
result
Color:Blue Name:Rockman
Color:Blue Name:Shadowman
-------------------------------------
Color:Red Name:Quickman
-------------------------------------
Color:Yellow Name:Elecman
-------------------------------------
-------------------------------------
-------------------------------------
強さが3以上のロボットのみ出力できています。今回の例の場合は各リストから2つ以上の要素が存在する場合もあるので、2重でforeachを書かなければなりません。
まとめ
今回は各グループから指定した条件の要素を取り出す記事を記述しました。
Linqでのグループ化について、より深く学ぶことが出来ればいいと思っています。
記事を最後まで見て頂き、ありがとうございました。
他のLinqの記事についてはこちら