はじめに
- 次の環境を使用して動作確認しています。
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の書き方としてクエリ構文、メソッド構文がありますが、ここではメソッド構文を使用しています。 - 完全なソースコードはこちらで公開しています。
変換方法のサンプル
// 変換元
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()を使うと簡潔に実現できる場合があります。
参考として、前述のサンプルで使用しているメソッドやクラスを次に示します。
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}}}";
}