NDW

アプリ開発やトラブルシューティング等のノウハウ、キャンプや登山の紹介や体験談など。

.NET Core 1. システムエンジニアリング 実装技術

.NET Core(C#): 配列/List/Dictionary/HashSet変換方法

投稿日:

はじめに

  • 次の環境を使用して動作確認しています。
    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}}}";
}






-.NET Core, 1. システムエンジニアリング, 実装技術

関連記事

Excelで大量データから重複値を検索する方法

100万件程の大量データの中で重複するデータを見つける方法を紹介します。 前提条件 検証で使用した環境は次の通りです。 RAND()関数で作成した約100万件(Excelの最大行数となる1,048,5 …

Excel VBAでJSONを自動生成

サンプルExcelシートの説明 Excelシート上に記載したフィールドや値をJSONに出力できます。 「配列」(I列)、「型」(J列)を変更することで、JSONへの値の出力仕様を変更できます。JSON …

500円でVPS:VULTRの$2.5/$3.5プラン

月額500円程度でVPSを運用できるVULTRの紹介です。 VULTR(ヴァルチャー)は米国フロリダにある会社で、日本法人はない。(LinkedIn) 欧米・アジア・日本等の17拠点のデータセンターを …

疎通確認用pingツール

新人君たちと本番環境の構築作業でデータセンターに入り。 構築したサーバから、既存の重要なサーバへの疎通確認を行うために、pingを何度も入力する予定とのこと。 作業時間の短縮や間違いの低減のために、こ …

リモートからのwarデプロイの自動化

JavaEEベースのツールを公開しているが、デプロイの都度、warファイルをサーバにコピーしてwildflyにデプロイするのが面倒なので、mavenで自動化しました。 前提 mavenのプラグインと後 …