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

関連記事

AzureAD B2Cユーザアカウントの操作方法(PowerShell)

Microsoft Graph APIを使ってAzureAD B2Cユーザアカウントを操作するようなアプリケーションを開発しています。 テストエビデンスの取得のために、Microsoft Graph …

技術検証

LinuxでGoogle Driveを操作(rcloneの使い方)

概要 RHEL8.3にて、rcloneを使用してGoogle Driveに接続する方法を説明します。 rclone.org  1 Tweet 168 Users 3189 PocketsRc …

Windowsの証明書ストアの基礎知識と確認方法

※証明書ストア、システムストア、物理ストアの厳密な定義や違いを読み解けなかったため、マイクロソフトのリファレンスを意訳して言葉を使用しています。 証明書ストアの基礎 証明書は「ローカルコンピューター」 …

vbaでのエンコード/デコードのサンプル

Excel(vba)で、MD5/SHA-1/SHA-2(SHA-256)の出力、Hex/Base64エンコード/デコードを調べたので備忘録として残します。 動作検証した環境は、Windows10+Of …

ASP.NET Core: 日本語の文字化け

ダイジェスト Visual Studio 2019で作成したASP.NET Coreプロジェクトで、プログラム(Razor)から日本語を出力するとHTMLエンコードされてしまいます。例えば「さしすせそ …