Konvertieren Sie das Wörterbuch <string, string> in einen durch Semikolons getrennten String in c #


135

Einfach, um den Tag zu beginnen, gegeben Dictionary<string, string>wie folgt:

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

Ich möchte einen String erstellen: "A=1;B=2;C=3;D=4"

Eine Beispielimplementierung:

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();

Beachten Sie, dass das Wörterbuch wahrscheinlich weniger als 10 Elemente enthält, was darauf hindeutet, dass ein StringBuilder übertrieben ist.

Welche alternativen Implementierungen sind prägnanter / effizienter? Verfügt das Framework über Funktionen, die helfen?

Antworten:


290
using System.Linq;

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

(Wenn Sie .NET 4 oder höher verwenden, können Sie den letzten ToArrayAufruf weglassen .)


Schön :-) Allerdings würde ich String.Format ("{0} = {1}", x.Key, x.Value) anstelle des Operators + verwenden
Amittai Shapira

7
@Amittai, @the_drow: Vielleicht bevorzugen Sie string.Format; Ich bevorzuge k+"="+veinfache Verkettungen wie diese. Jeder für sich, denke ich ...
LukeH

2
Beachten Sie, dass der Anruf bei ToArray()nicht benötigt wird. Das Entfernen führt zu einem Aufruf von String.Join<String>(String, IEnumerable<String>)anstelle von String.Join(String, String[]).
Dan Stevens

8
Wenn Sie sich nicht für das genaue Ausgabeformat interessieren, können Sie dies tun string.Join(", ", myDict). Es wird in der Form [A, 1], [B, 2], [C, 3], [D, 4]
ausgegeben

2
@SRJ Empty unterscheidet sich stark von Null .... Empty ""oder Whitespace " "sind gültige Schlüssel in einem Wörterbuch. Obwohl dies nicht empfohlen wird, handelt es sich um gültige Werte. Sie müssen ContainsKeyüberprüfen, ob Sie einen bestimmten Schlüsselnamen oder ein Sprachkonstrukt benötigen, foreachdas der Erfassung der Werte entspricht.
GoldBishop

39

Eine andere Option ist die Verwendung der Aggregate-Erweiterung anstelle von Join:

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

perfekter linq style!
Menkow

1

Damit Linq funktioniert Dictionary, benötigen Sie mindestens .Net v3.5 und using System.Linq;.

Einige Alternativen:

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

oder

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

Wenn Sie Linq aus irgendeinem Grund nicht verwenden können, verwenden Sie 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

Dies ist die gleiche Antwort, die @LukeH oben hat.
Rick Glos

Alter, es ist nicht dasselbe, es ist nicht nötig, ToArray () zu verwenden. Bitte stimmen Sie meine Antwort nicht ab.
Jaydeep Shil

2
Es ist dasselbe - er erwähnt das Entfernen ToArray()bei Verwendung höherer Versionen des Frameworks.
Rick Glos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.