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. システムエンジニアリング, 実装技術

関連記事

wildflyへのwarデプロイの自動化

更新したWebアプリをWildflyにデプロイするのが面倒なのでスクリプトを作成してみました。 前提 実行環境はCentOS Linux 7です。 JavaEEのWebアプリの配布形式であるwarファ …

.NET Core(C#): DateTimeの使い方サンプル

はじめに サンプルは.NET Core 3.1(Windows 10)で動作確認しています。 型が分かりやすいよう変数宣言ではvarを使用していません。実装時はvarを使用することをおすすめします。 …

ASP.NET Core: IHttpClientFactoryの使用方法

とりあえず、どんなサンプルになるか知りたい人は下記のサンプルをご覧ください。 ASP.NET Core: IHttpClientFactoryの単純サンプル ASP.NET Core: IHttpCl …

.NET Core(C#): JsonSerializer実践オプションとコンバータ

業務アプリの開発を想定したJsonSerializerの使い方とサンプルです。 概要 .NET Core 3.1の標準パッケージSystem.Text.Jsonに含まれるJsonSerializerを …

jQueryによるデフォルトボタンの実装

デフォルトボタンについて Webページ上でエンターキーを押した場合、そのページ上であらかじめ決められたボタンをクリックしたかのように処理を実行する仕組みがある。何らかのデータの検索を行うようなページは …