今回のテーマ
今回の記事は下記の記事の続きです。まだ見てない方は是非みてくださいね。
こちらもCHECK
-
C# Sharp DataTable型にLinqを扱うためにAsEnumerableメソッドを使おう
ChatGPTのAPIを使わずに自動化することが可能です。 下記の本を読めば、ChatGPT4でも料金掛からずに自動化できます!KindleUnlimited会員であれば無料で読めます。 今回のテーマ ...
続きを見る
今回のテーマ
DataTable型の全データをリスト化する方法
前回の記事を読んで頂いた方、1つ疑問を持ちませんでしたか??
DataTable型の1項目しかリスト化できないじゃん!!ってことです。
確かに前回の記事の内容では1項目しかリスト化できません。
なので、今回の記事ではタプルを使用して、DataTable型の全てのデータをリスト化してみましょう!!
DataTable型の全てのデータをリスト化する
それではやっていきます!!ロボットテーブルに項目を4つ指定して、リスト化してみます。
下記のソースコードをみてください。
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
using System; using System.Collections.Generic; using System.Data; using System.Linq; class Program { static void Main(string[] args) { DataTable dt = new DataTable("Robot"); dt.Columns.Add("Name"); dt.Columns.Add("Maker"); dt.Columns.Add("Color"); dt.Columns.Add("Strength"); DataRow dr = dt.NewRow(); dr["Name"] = "Rockman"; dr["Maker"] = "Dr_Light"; dr["Color"] = "Blue"; dr["Strength"] = "5"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Rollchan"; dr["Maker"] = "Dr_Light"; dr["Color"] = "Pink"; dr["Strength"] = "1"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Fireman"; dr["Maker"] = "Dr_Wily"; dr["Color"] = "Red"; dr["Strength"] = "3"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Iceman"; dr["Maker"] = "Dr_Wily"; dr["Color"] = "Red"; dr["Strength"] = "4"; dt.Rows.Add(dr); //全ての列をタプルに定義 var namelist = dt.AsEnumerable() .Select(n => (n["Name"].ToString(), n["Maker"].ToString(), n["Color"].ToString(), n["Strength"].ToString())) .ToList(); foreach(var name in namelist) { Console.WriteLine(name.Item1 + ":" + name.Item2 + ":" + name.Item3 + ":" + name.Item4); } } } |
出力結果
Rockman:Dr_Light:Blue:5
Rollchan:Dr_Light:Pink:1
Fireman:Dr_Wily:Red:3
Iceman:Dr_Wily:Red:4
リストとタプルを組み合わせて、DataTable型の全ての項目を出力することができましたね。
このようにリストとタプルを組み合わせることで、自由にLinqを使用することができます!
各項目を見やすくする為にタプルを修正
上記のようにタプルに各項目の値を設定すれば、DataTable内の全てのデータを
使うことはできるのですが、後のことを考えて下記のようにしたほうが良いと思います。
タプルの定義をvar型にすることをやめ、具体的に明示したほうが使用する時にミスが減ります。
Item1、Item2では何を指定しているか分かりにくいですからね。
少し長くなるけど、そこは頑張ってください。
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
using System; using System.Collections.Generic; using System.Data; using System.Linq; class Program { static void Main(string[] args) { DataTable dt = new DataTable("Robot"); dt.Columns.Add("Name"); dt.Columns.Add("Maker"); dt.Columns.Add("Color"); dt.Columns.Add("Strength"); DataRow dr = dt.NewRow(); dr["Name"] = "Rockman"; dr["Maker"] = "Dr_Light"; dr["Color"] = "Blue"; dr["Strength"] = "5"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Rollchan"; dr["Maker"] = "Dr_Light"; dr["Color"] = "Pink"; dr["Strength"] = "1"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Fireman"; dr["Maker"] = "Dr_Wily"; dr["Color"] = "Red"; dr["Strength"] = "3"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Iceman"; dr["Maker"] = "Dr_Wily"; dr["Color"] = "Red"; dr["Strength"] = "4"; dt.Rows.Add(dr); //全ての列をタプルに定義 List<(string Name, string Maker, string Color, string Strength)> namelist = dt.AsEnumerable() .Select(n => (n["Name"].ToString(), n["Maker"].ToString(), n["Color"].ToString(), n["Strength"].ToString())) .ToList(); foreach(var name in namelist) { Console.WriteLine(name.Name + ":" + name.Maker + ":" + name.Color + ":" + name.Strength); } } } |
出力結果
Rockman:Dr_Light:Blue:5
Rollchan:Dr_Light:Pink:1
Fireman:Dr_Wily:Red:3
Iceman:Dr_Wily:Red:4
ここまでは、DataTable型のデータをリストとタプルを組み合わせて変換しました!
ここからはDataTable型のデータをリストとクラスを組み合わせて、定義していきます!
DataTable型のデータとクラスの準備
前回と同様に列が4つあるテーブルを用意します。
こんな感じです。
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 35 36 37 38 39 40 41 42 43 |
using System; using System.Data; using System.Linq; class Program { static void Main(string[] args) { DataTable dt = new DataTable("Robot"); dt.Columns.Add("Name"); dt.Columns.Add("Maker"); dt.Columns.Add("Color"); dt.Columns.Add("Strength"); DataRow dr = dt.NewRow(); dr["Name"] = "Rockman"; dr["Maker"] = "Dr_Light"; dr["Color"] = "Blue"; dr["Strength"] = "5"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Rollchan"; dr["Maker"] = "Dr_Light"; dr["Color"] = "Pink"; dr["Strength"] = "1"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Fireman"; dr["Maker"] = "Dr_Wily"; dr["Color"] = "Red"; dr["Strength"] = "3"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Iceman"; dr["Maker"] = "Dr_Wily"; dr["Color"] = "Red"; dr["Strength"] = "4"; dt.Rows.Add(dr); foreach (DataRow robot in dt.Rows) { Console.WriteLine(robot["Name"]); } } } |
出力結果
Rockman
Rollchan
Fireman
Iceman
続けて、Robotクラスを下記のように定義します。DataTable型のデータを下記のクラスに設定できればOKです!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Robot { string name, maker, color, strength; public Robot(string _name, string _maker, string _color, string _strength) { name = _name; maker = _maker; color = _color; strength = _strength; } public string getName() { return name; } public string getMaker() { return maker; } public string getColor() { return color; } public string getStrength() { return strength; } } |
DataTable型のデータをリストに格納する
それでは、早速ロボット型を定義したリストに格納してみましょう。
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 35 36 37 38 39 40 41 42 43 44 45 |
using System; using System.Data; using System.Linq; class Program { static void Main(string[] args) { DataTable dt = new DataTable("Robot"); dt.Columns.Add("Name"); dt.Columns.Add("Maker"); dt.Columns.Add("Color"); dt.Columns.Add("Strength"); DataRow dr = dt.NewRow(); dr["Name"] = "Rockman"; dr["Maker"] = "Dr_Light"; dr["Color"] = "Blue"; dr["Strength"] = "5"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Rollchan"; dr["Maker"] = "Dr_Light"; dr["Color"] = "Pink"; dr["Strength"] = "1"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Fireman"; dr["Maker"] = "Dr_Wily"; dr["Color"] = "Red"; dr["Strength"] = "3"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Iceman"; dr["Maker"] = "Dr_Wily"; dr["Color"] = "Red"; dr["Strength"] = "4"; dt.Rows.Add(dr); var robotlist = dt.AsEnumerable().Select(n => new Robot(n["Name"].ToString(), n["Maker"].ToString(), n["Color"].ToString(), n["Strength"].ToString())) .ToList(); foreach(var robot in robotlist) { Console.WriteLine(robot.getName() + ":" + robot.getMaker() + ":" + robot.getColor() + ":" + robot.getStrength()); } } } |
出力結果
Rockman:Dr_Light:Blue:5
Rollchan:Dr_Light:Pink:1
Fireman:Dr_Wily:Red:3
Iceman:Dr_Wily:Red:4
出来ました!ロボットクラスでデータを格納してあるので、ロボットクラス内で定義しているメソッドなども使い放題ですね!!
全体のプログラム
全体のプログラムは下記となります。ぜひ参考にしてくださいね。
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
using System; using System.Data; using System.Linq; class Program { static void Main(string[] args) { DataTable dt = new DataTable("Robot"); dt.Columns.Add("Name"); dt.Columns.Add("Maker"); dt.Columns.Add("Color"); dt.Columns.Add("Strength"); DataRow dr = dt.NewRow(); dr["Name"] = "Rockman"; dr["Maker"] = "Dr_Light"; dr["Color"] = "Blue"; dr["Strength"] = "5"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Rollchan"; dr["Maker"] = "Dr_Light"; dr["Color"] = "Pink"; dr["Strength"] = "1"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Fireman"; dr["Maker"] = "Dr_Wily"; dr["Color"] = "Red"; dr["Strength"] = "3"; dt.Rows.Add(dr); dr = dt.NewRow(); dr["Name"] = "Iceman"; dr["Maker"] = "Dr_Wily"; dr["Color"] = "Red"; dr["Strength"] = "4"; dt.Rows.Add(dr); var robotlist = dt.AsEnumerable().Select(n => new Robot(n["Name"].ToString(), n["Maker"].ToString(), n["Color"].ToString(), n["Strength"].ToString())) .ToList(); foreach (var robot in robotlist) { Console.WriteLine(robot.getName() + ":" + robot.getMaker() + ":" + robot.getColor() + ":" + robot.getStrength()); } } class Robot { string name, maker, color, strength; public Robot(string _name, string _maker, string _color, string _strength) { name = _name; maker = _maker; color = _color; strength = _strength; } public string getName() { return name; } public string getMaker() { return maker; } public string getColor() { return color; } public string getStrength() { return strength; } } } |
まとめ
リストとタプルの組み合わせとクラスを定義してリストに格納する方法どっちを使うべきなのでしょうか。
私は、下記のように使い分けています。
使い分け方
- リストとタプル リストに格納した後に一部分のソースコードでしか使用しない場合
- クラスの定義 リストに格納した後に複数のソースコードで沢山利用する場合
場面場面で使用する方法を変えていけばいいと思います。
どちらの方法も使いやすい形に変えており、間違えではないのでバンバン使っちゃってくださいね!!
それでは、今回の記事は以上です。最後まで見て頂きありがとうございました。