2011-11-03 18 views
19

Come convertire un dizionario di coppie di valori chiave in una singola stringa? Puoi farlo utilizzando gli aggregati LINQ? Ho visto esempi su come farlo usando un elenco di stringhe, ma non un dizionario.Il modo migliore per convertire il dizionario <stringa, stringa> in una rappresentazione di stringa aggregata singola?

ingresso:

Dictionary<string, string> map = new Dictionary<string, string> { 
      {"A", "Alpha"}, 
      {"B", "Beta"}, 
      {"G", "Gamma"} 
}; 

uscita:

string result = "A:Alpha, B:Beta, G:Gamma"; 

risposta

42

Questo è il modo più conciso mi viene in mente:

var result = string.Join(", ", map.Select(m => m.Key + ":" + m.Value).ToArray()); 

Tuttavia, a seconda delle circostanze , questo potrebbe essere più veloce (anche se non molto elegante):

var result = map.Aggregate(new StringBuilder(), 
    (a, b) => a.Append(", ").Append(b.Key).Append(":").Append(b.Value), 
    (a) => a.Remove(0, 2).ToString()); 

Ho eseguito ognuno dei precedenti con un numero variabile di iterazioni (10.000; 1.000.000; 10.000.000) sul tuo dizionario di tre voci e sul mio portatile, quest'ultimo era in media il 39% più veloce. Su un dizionario con 10 elementi, quest'ultimo era solo circa il 22% più veloce.

Un'altra cosa da notare, semplice concatenazione di stringhe nel mio primo esempio è stato circa il 38% più veloce rispetto alla string.Format() variazione mccow002's answer, come ho il sospetto che è gettando in un piccolo costruttore di archi al posto della concatenazione, data la performance quasi identica metrica.

per ricreare il dizionario originale dalla stringa risultato, si potrebbe fare qualcosa di simile:

var map = result.Split(',') 
    .Select(p => p.Trim().Split(':')) 
    .ToDictionary(p => p[0], p => p[1]); 
+0

Didn ' Vedo il tuo prima di pubblicare il mio. +1 per il pensiero brillante :) – mccow002

+1

@CoryLarson Ah, fantastico. Commento: ritirato. – dlev

+0

come posso tornare da questi risultati var al dizionario originale? – zipi

8
string result = string.Join(", ", map.Select(x => string.Format("{0}:{1}", x.Key, x.Value)).ToArray()) 
3

Questo utilizza LINQ Aggregate method:

map 
.Select(m => $"{m.Key}:{m.Value}") 
.Aggregate((m1, m2) => $"{m1}, {m2}"); 

stesso ma con string.Format():

map 
.Select(m => string.Format("{0}:{1}", m.Key, m.Value)) 
.Aggregate((m1, m2) => string.Format("{0}, {1}", m1, m2)) 
Problemi correlati