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.