はじめに
- 次の環境を使用して動作確認しています。
OS Windows 10(64ビット) IDE Microsoft Visual Studio Community 2019(16.8.5) + C#(8.0) パッケージ Microsoft.NET.Test.Sdk 16.10.0
xunit 2.4.1
xunit.runner.visualstudio 2.4.3
Moq 4.16.1 - 実装を簡単にするためにLinq(System.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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | // 変換元 string[] strs = new string[] { "1", "2", "3", "4" }; // string[] -> List<string> 変換 var strList = strs.ToList(); Console.WriteLine("strList: {0}", Dump(strList)); // string[] -> List<int> 変換 var intList = strs.Select(s => int.Parse(s)).ToList(); Console.WriteLine("intList: {0}", Dump(intList)); // string[] -> List<Person> 変換 var personList = strs.Select(s => new Person(s)).ToList(); Console.WriteLine("personList: {0}", Dump(personList)); // 変則的な変換 // {"1", "2", "3", "4"} -> {"12", 34"} var exList = Enumerable.Range(0, strs.Length) // 連番リストの生成 .Where(i => i % 2 == 0) // 一つ飛ばし(奇数番目のみ処理) .Select(i => strs[i] + strs[i + 1]) // 後ろの文字と結合 .ToList(); Console.WriteLine("exList: {0}", Dump(exList)); // string[] -> HashSet<string> 変換 var set = strs.ToHashSet(); Console.WriteLine("set: {0}", Dump(set)); // string[] -> Dictionary<string, string> 変換 // ※ToDictionaryの引数はstrsの基型string var dic = strs.ToDictionary(k => "key" + k, v => "value" + v); Console.WriteLine("dic: {0}", Dump(dic)); // Dictionaryのキーと値をリスト化 var keyList = dic.Keys.ToList(); Console.WriteLine("keyList: {0}", Dump(keyList)); var valueList = dic.Values.ToList(); Console.WriteLine("valueList: {0}", Dump(valueList)); // Dictionary間の変換 // Dictionary<string, string> -> Dictionary<string, Person> 変換 // ※ToDictionaryの引数はdicの基型KeyValuPair<string, string> var personDic = dic.ToDictionary(kv => kv.Key, kv => new Person(kv.Value)); Console.WriteLine("personDic: {0}", Dump(personDic)); |
- Linqの多くの機能はIEnumerable<>の拡張メソッド(Enumerable)として実装されています。そのため、IEnumerable<>を実装している配列やリスト等は同様に変換可能です。サンプルでは入力として配列を指定していますが、List型などでも同様に機能します。
- 変換元IEnumerable<>を実装している配列やリスト等であれば、変換元に関わらず変換先に合わせて、ToArray(), ToList(), ToDictionary(), ToHashSet()を実行することで変換できます。
- 型変換や編集した値を使用してリストなどを生成したい場合、Select()を使用します。Select()の引数で渡した関数(ラムダ式)の戻り値型が、新しいリストの基の型になります。
- リスト上の複数要素を使って生成した値のリストを作成する場合、Enumerable.Range()を使うと簡潔に実現できる場合があります。
参考として、前述のサンプルで使用しているメソッドやクラスを次に示します。
1 2 3 4 5 6 7 8 9 10 11 12 | private string Dump<T>(IEnumerable<T> enums) => string.Join(',', enums); private string Dump<K, V>(Dictionary<K, V> dic) => Dump(dic.Select(p => $"{p.Key}={p.Value}").ToArray()); class Person { public string Id { get; set; } public Person(string id) => Id = id; public override string ToString() => $"Person{{Id={Id}}}"; } |