Dictionary <string、string>をc#でセミコロン区切りの文字列に変換します


135

Dictionary<string, string>次のように与えられた、1日を始めるシンプルなもの:

var myDict = new Dictionary<string, string>();
myDict["A"] = "1";
myDict["B"] = "2";
myDict["C"] = "3";
myDict["D"] = "4";

文字列を作成したい: "A=1;B=2;C=3;D=4"

実装例:

var myStringBuilder = new StringBuilder();
bool first = true;
foreach (KeyValuePair<string, string> pair in myDict)
{
    if (first)
    {
        first = false;
    }
    else
    {
        myStringBuilder.Append(";");
    }

    myStringBuilder.AppendFormat("{0}={1}", pair.Key, pair.Value);
}

var myDesiredOutput = myStringBuilder.ToString();

辞書のアイテム数は10未満である可能性が高いことに注意してください。これは、StringBuilderが過剰であることを示唆しています。

どの代替実装がより簡潔/効率的ですか?フレームワークに役立つ機能はありますか?

回答:


290
using System.Linq;

string s = string.Join(";", myDict.Select(x => x.Key + "=" + x.Value).ToArray());

(そして、.NET 4以降を使用している場合は、最後のToArray呼び出しを省略できます。)


ニース:-)ただし、+演算子の代わりにString.Format( "{0} = {1}"、x.Key、x.Value)を使用します
Amittai Shapira

7
@アミタイ、@ the_drow:あなたが好むかもしれませんstring.Format。私はk+"="+vこのような単純な連結を好む。一人一人に私は推測する...
LukeH

2
への呼び出しToArray()は必要ないことに注意してください。削除すると、String.Join<String>(String, IEnumerable<String>)ではなくが呼び出されますString.Join(String, String[])
Dan Stevens

8
正確な出力形式を気にしない場合は、行うことができますstring.Join(", ", myDict)。次の形式で出力されます[A, 1], [B, 2], [C, 3], [D, 4]
altumano '19年

2
@SRJ EmptyはNull .... Empty ""またはWhitespace " "とは大きく異なり、ディクショナリの有効なキーです。どちらを使用することもお勧めしませんが、これらは有効な値です。あなたは実行する必要がありContainsKeyますが、特定のキー名またはと同等言語構造が必要な場合はチェックをforeach値をキャプチャするが。
GoldBishop 2018

39

別のオプションは、JoinではなくAggregate拡張を使用することです。

String s = myDict.Select(x => x.Key + "=" + x.Value).Aggregate((s1, s2) => s1 + ";" + s2);

完璧なリンクスタイル!
menkow 2017

1

Linqが動作Dictionaryするためには、少なくとも.Net v3.5とが必要using System.Linq;です。

いくつかの選択肢:

string myDesiredOutput = string.Join(";", myDict.Select(x => string.Join("=", x.Key, x.Value)));

または

string myDesiredOutput = string.Join(";", myDict.Select(x => $"{x.Key}={x.Value}"));

何らかの理由でLinqを使用できない場合は、次を使用しますStringbuilder

StringBuilder sb = new StringBuilder();
var isFirst = true;
foreach(var x in myDict) 
{
  if (isFirst) 
  {
    sb.Append($"{x.Key}={x.Value}");
    isFirst = false;
  }
  else
    sb.Append($";{x.Key}={x.Value}"); 
}

string myDesiredOutput = sb.ToString(); 

myDesiredOutput:

A=1;B=2;C=3;D=4

-3

これは、@ LukeHが上記と同じ答えです。
Rick Glos

同じではありません、ToArray()を使用する必要はありません。私の回答に反対票を投じないでください。
Jaydeep Shil

2
それは同じです-彼はToArray()フレームワークのより高いバージョンを使用するときの削除について言及しています。
Rick Glos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.