2011-11-03 13 views
19

¿Cómo convertiría un diccionario de pares de valores clave en una sola cadena? ¿Puedes hacer esto usando los agregados LINQ? He visto ejemplos sobre cómo hacer esto usando una lista de cadenas, pero no un diccionario.¿La mejor manera de convertir el diccionario <cadena, cadena> en representación de cadena agregada única?

de entrada:

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

Salida:

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

Respuesta

42

Ésta es la forma más concisa que puedo pensar:

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

Sin embargo, dependiendo de sus circunstancias , Esto podría ser más rápido (aunque no muy elegante):

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

Ejecuté cada uno de los anteriores con un número variable de iteraciones (10,000; 1,000,000; 10,000,000) en su diccionario de tres elementos y en mi computadora portátil, este último fue en promedio un 39% más rápido. En un diccionario con 10 elementos, este último solo fue aproximadamente un 22% más rápido.

otra cosa a tener en cuenta, simple concatenación de cadenas en mi primer ejemplo fue aproximadamente un 38% más rápido que la variación string.Format() en mccow002's answer, como sospecho que está lanzando en un pequeño generador de cadenas en lugar de la concatenación, dado el desempeño casi idéntico métrica.

para recrear el diccionario original de la cadena de resultado, se podría hacer algo como esto:

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

Didn ' Veo el tuyo antes de publicar el mío. +1 por pensamiento brillante :) – mccow002

+1

@CoryLarson Ah, genial. Comentario: retractado. – dlev

+0

¿cómo puedo volver de estos resultados de var al diccionario original? – zipi

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

Esto utiliza LINQ Aggregate method:

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

mismo pero con string.Format():

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