今回のテーマ
こんにちは、サルモリです。
今回はLinqを使用して、下記の変換をやっていきましょう。
変換内容
・リスト型を配列に
・配列をリスト型に
・リスト型をディクショナリ型に
・配列をディクショナリ型に
・ディクショナリ型をリスト型に
・ディクショナリ型を配列に
今まで型の変換はたくさんしてきましたが、変換について記事にしていませんでしたね。
今回はどんどん型を変換していきましょう!!
リスト型を配列に、配列をリスト型に
リスト型と配列の相互の変換は別の記事でも何回もやっていますね!
下記のメソッドを使いましょう!!
使用するメソッド
- ToArray:配列に変換
- ToList:リストに変換
それでは上記のメソッドを使って、早速例を記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; using System.Collections.Generic; class Program { static void Main(string[] args) { var pokelist = new List<string> { "ピカチュウ", "カイリュー", "ヤドラン", "ピジョン" }; var pokearray = pokelist.ToArray(); foreach (var poke in pokearray) { Console.WriteLine(poke); } Console.WriteLine("型は" + pokelist.GetType() + "ですよ。"); Console.WriteLine("型は" + pokearray.GetType() + "ですよ。"); } } |
出力結果
ピカチュウ
カイリュー
ヤドラン
ピジョン
型はSystem.Collections.Generic.List1[System.String]ですよ。
型はSystem.String[]ですよ。
正しく変換されていますね!
GetType()メソッドは指定した変数の型を受け取るメソッドです。
この調子で逆の配列→リストもやってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main(string[] args) { var pokearray = new string[]{ "ピカチュウ", "カイリュー", "ヤドラン", "ピジョン" }; var pokelist = pokearray.ToList(); foreach (var poke in pokelist) { Console.WriteLine(poke); } Console.WriteLine("型は" + pokelist.GetType() + "ですよ。"); Console.WriteLine("型は" + pokearray.GetType() + "ですよ。"); } } |
出力結果
ピカチュウ
カイリュー
ヤドラン
ピジョン
型はSystem.Collections.Generic.List1[System.String]ですよ。
型はSystem.String[]ですよ。
配列→リストも同じように結果が得られましたね!配列とリストは自由に変換できるので、覚えましょう!!
リスト型をディクショナリ型に、配列をディクショナリ型に
続けて、リスト型と配列をディクショナリ型にしてみます。
ディクショナリ型にするには、下記のメソッドを使用します。
使用するメソッド
- ToDictionary:ディクショナリに変換
ToDictionaryメソッドを使用して、とりあえずリストを変換してみましょう!
このような感じで指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main(string[] args) { var pokelist = new List<string>{ "ピカチュウ", "カイリュー", "ヤドラン", "ピジョン" }; var pokedict = pokelist.ToDictionary(n => n); foreach (var poke in pokedict) { Console.WriteLine(poke.Key + poke.Value); } Console.WriteLine("型は" + pokelist.GetType() + "ですよ。"); Console.WriteLine("型は" + pokedict.GetType() + "ですよ。"); } } |
出力結果
ピカチュウ:ピカチュウ
カイリュー:カイリュー
ヤドラン:ヤドラン
ピジョン:ピジョン
型はSystem.Collections.Generic.List1[System.String]ですよ。
型はSystem.Collections.Generic.Dictionary2[System.String,System.String]ですよ。
変換は出来ているけど、KeyもValueも同じ値になってますね 😥
これでは、あまり意味がない 😥
ディクショナリ型に変換する時は基本的にリストや配列内の型は複数個項目をもっているクラスの時などにしましょう!
例えば、下記の例のような感じです。ポケモンクラスを新しく作りました!!
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 |
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main(string[] args) { var pokelist = new List<Pokemon>{ new Pokemon(25,"ピカチュウ"), new Pokemon(149,"カイリュー"), new Pokemon(80,"ヤドラン"), new Pokemon(17,"ピジョン") }; var pokedict = pokelist.ToDictionary(n => n.No); foreach (var poke in pokedict) { Console.WriteLine(poke.Key + ":" + poke.Value); } Console.WriteLine("型は" + pokelist.GetType() + "ですよ。"); Console.WriteLine("型は" + pokedict.GetType() + "ですよ。"); } } class Pokemon { public Pokemon(int _No,string _Name) { No = _No; Name = _Name; } public int No; public string Name; } |
出力結果
25:Pokemon
149:Pokemon
80:Pokemon
17:Pokemon
型はSystem.Collections.Generic.List1[Pokemon]ですよ。
型はSystem.Collections.Generic.Dictionary2[System.Int32,Pokemon]ですよ。
図鑑番号がKeyに名前がValueに入りましたね。
ポイントは下記のソースコードです。
1 |
pokelist.ToDictionary(n => n.No); |
ToDictionaryの引数で指定した項目がKeyとなります。
この1つ前のKeyが名前になってしまったソースコードでは、リスト内にstring型1つしかなかったので、
Keyに名前を指定してしまったということです。
余談ですが、図鑑番号調べるのめんどくさかった 😥
素直に「フシギダネ、フシギソウ・・」とかにしておけばよかった・・。
配列も同様にディクショナリ型に出来るので、割愛しますね!!
ディクショナリ型をリスト型に、ディクショナリ型を配列に
最後にディクショナリ型をリスト型、配列にしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main(string[] args) { var pokedict = new Dictionary<int, string>{ {25,"ピカチュウ" }, {149,"カイリュー" }, {80,"ヤドラン" }, {17,"ピジョン" }}; var pokelist = pokedict.ToList(); foreach (var poke in pokelist) { Console.WriteLine(poke.Key + ":" + poke.Value); } Console.WriteLine("型は" + pokelist.GetType() + "ですよ。"); Console.WriteLine("型は" + pokedict.GetType() + "ですよ。"); } } |
出力結果
25:ピカチュウ
149:カイリュー
80:ヤドラン
17:ピジョン
型はSystem.Collections.Generic.List1[System.Collections.Generic.KeyValuePair`2[System.Int32,System.String]]ですよ。
型はSystem.Collections.Generic.Dictionary2[System.Int32,System.String]ですよ。
ToListメソッドでリスト型に変換できました!
ToListメソッドが優秀で、自動的にKeyValuePair型として値を二つ保持できるようになっています。
配列に変換したパターンもみてみましょう!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main(string[] args) { var pokedict = new Dictionary<int, string>{ {25,"ピカチュウ" }, {149,"カイリュー" }, {80,"ヤドラン" }, {17,"ピジョン" }}; var pokearray = pokedict.ToArray(); foreach (var poke in pokearray) { Console.WriteLine(poke.Key + ":" + poke.Value); } Console.WriteLine("型は" + pokearray.GetType() + "ですよ。"); Console.WriteLine("型は" + pokedict.GetType() + "ですよ。"); } } |
出力結果
25:ピカチュウ
149:カイリュー
80:ヤドラン
17:ピジョン
型はSystem.Collections.Generic.KeyValuePair2[System.Int32,System.String][]ですよ。
型はSystem.Collections.Generic.Dictionary2[System.Int32,System.String]ですよ。
ToArrayメソッドも優秀で、自動的にKeyValuePair型に変換して、2つの値を保持していますね!
まとめ
今回はリスト型、配列型、ディクショナリ型の相互の変換についての記事でした。
使用したメソッドはこちら
・ToList
・ToArray
・ToDictionary
Linqを使用すればかなり簡単に変換ができると思うので、是非たくさん使ってくださいね!!
配列、リストなどの記事はこちら