Converti dizionario <stringa, stringa> in stringa separata da punto e virgola in c #


135

Uno semplice per iniziare la giornata, dato Dictionary<string, string>il seguente:

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

Vorrei creare una stringa: "A=1;B=2;C=3;D=4"

Un'implementazione di esempio:

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

Nota che è probabile che il dizionario contenga meno di 10 elementi, il che suggerisce che StringBuilder sia eccessivo.

Quali implementazioni alternative sono più succinte / efficienti? Il framework ha delle funzionalità che ti aiuteranno?

Risposte:


290
using System.Linq;

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

(E se stai usando .NET 4 o più recente, puoi omettere la ToArraychiamata finale .)


Bello :-) Comunque, userei String.Format ("{0} = {1}", x.Key, x.Value) invece dell'operatore +
Amittai Shapira,

7
@Amittai, @the_drow: potresti preferire string.Format; Preferisco k+"="+vconcatenazioni semplici come questa. Ognuno per conto proprio immagino ...
Luca

2
Si noti che la chiamata a ToArray()non è necessaria. La sua rimozione comporta una chiamata a String.Join<String>(String, IEnumerable<String>)anziché String.Join(String, String[]).
Dan Stevens,

8
Se non ti interessa l'esatto formato di output, puoi farlo string.Join(", ", myDict). [A, 1], [B, 2], [C, 3], [D, 4]
Uscirà

2
@SRJ Empty è molto diverso da Null .... Empty "", o Whitespace " ", sono chiavi valide in un dizionario. Sebbene non sia consigliato l'uso di entrambi, sono valori validi. È necessario ContainsKeyverificare se è necessario un nome chiave specifico o un costrutto della lingua equivalente a foreachper acquisire i valori.
GoldBishop,

39

Un'altra opzione è utilizzare l'estensione Aggregate anziché Join:

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

perfetto stile linq!
menkow,

1

Affinché Linq funzioni, Dictionaryè necessario almeno .Net v3.5 e using System.Linq;.

Alcune alternative:

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

o

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

Se non è possibile utilizzare Linq per qualche motivo, utilizzare 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

Questa è la stessa risposta che @LukeH ha sopra.
Rick Glos,

amico non è lo stesso, non è necessario utilizzare ToArray (). Per favore, non sottovalutare la mia risposta.
Jaydeep Shil,

2
È lo stesso - menziona la rimozione di ToArray()quando si usano versioni superiori del framework.
Rick Glos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.