Konwertuj Dictionary <ciąg, ciąg> na ciąg rozdzielany średnikami w języku C #


135

Prosty sposób na rozpoczęcie dnia, biorąc pod uwagę Dictionary<string, string>:

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

Chcę stworzyć ciąg: "A=1;B=2;C=3;D=4"

Przykładowa realizacja:

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

Zauważ, że słownik prawdopodobnie zawiera mniej niż 10 elementów, co sugeruje, że StringBuilder jest przesadą.

Jakie alternatywne implementacje są bardziej zwięzłe / wydajne? Czy framework ma jakieś funkcje, które pomogą?

Odpowiedzi:


290
using System.Linq;

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

(A jeśli używasz .NET 4 lub nowszego, możesz pominąć końcowe ToArraywywołanie).


Fajnie :-) Jednak użyłbym String.Format ("{0} = {1}", x.Key, x.Value) zamiast operatora +
Amittai Shapira

7
@Amittai, @the_drow: Wolisz string.Format; Wolę takie k+"="+vproste konkatenacje. Myślę, że każdy dla siebie ...
LukeH

2
Pamiętaj, że połączenie z ToArray()numerem nie jest potrzebne. Usunięcie go powoduje wywołanie String.Join<String>(String, IEnumerable<String>)zamiast String.Join(String, String[]).
Dan Stevens

8
Jeśli nie zależy Ci na dokładnym formacie wyjściowym, możesz to zrobić string.Join(", ", myDict). Pojawi się w postaci[A, 1], [B, 2], [C, 3], [D, 4]
altumano

2
@SRJ Empty bardzo różni się od Null .... Puste ""lub odstępy " "to prawidłowe klucze w słowniku. Chociaż nie zaleca się ich używania, są to prawidłowe wartości. Musisz ContainsKeysprawdzić, czy potrzebujesz określonej nazwy klucza lub konstrukcji językowej równoważnej foreachdo przechwytywania wartości.
GoldBishop

39

Inną opcją jest użycie rozszerzenia Aggregate zamiast Join:

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

doskonały styl linq!
menkow

1

Aby Linq działał Dictionary, potrzebujesz co najmniej .Net v3.5 i using System.Linq;.

Niektóre alternatywy:

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

lub

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

Jeśli z jakiegoś powodu nie możesz użyć Linq, użyj 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

To ta sama odpowiedź, którą @LukeH ma powyżej.
Rick Glos

koleś, to nie to samo, nie ma potrzeby używania ToArray (). Proszę, nie odrzucaj mojej odpowiedzi.
Jaydeep Shil

2
Jest tak samo - wspomina o usunięciu ToArray()przy korzystaniu z wyższych wersji frameworka.
Rick Glos
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.