2011-05-05 29 views
49

Encontré que la implementación predeterminada de ToString en el diccionario no es lo que quiero. Me gustaría tener {key=value, ***}.¿Hay alguna forma de convertir un diccionario a String a mano?

Cualquier forma práctica de conseguirlo?

+3

Es esto para la visualización sólo en el depurador? ¿O esta cadena está destinada a ser orientada al usuario? – TreDubZedd

+1

Creo que esto está muy bien hecho por JSON serializador –

+0

Ver http://stackoverflow.com/questions/3639094/most-efficient-dictionaryk-v-tostring-with-formatting –

Respuesta

74

probar este método de extensión:

public static string ToDebugString<TKey, TValue> (this IDictionary<TKey, TValue> dictionary) 
{ 
    return "{" + string.Join(",", dictionary.Select(kv => kv.Key + "=" + kv.Value).ToArray()) + "}"; 
} 
+1

no veo la necesidad de 'ToArray()', ni para 'ToString()' 's. –

+1

@StevenJeuris: 'ToArray()' es realmente necesario, si está usando una versión inferior a NET 4.0 – Jack

+1

exactamente como map.toString() en java;) – Choletski

3

Tal vez:

string.Join 
(
    ",", 
    someDictionary.Select(pair => string.Format("{0}={1}", pair.Key.ToString(), pair.Value.ToString())).ToArray() 
); 

Primera iterar cada par clave-valor y darle formato como desee para ver como cadena, y más tarde convertirse al array y unirse en una sola cadena.

10

¿Qué tal una extensión método como:

public static string MyToString<TKey,TValue> 
     (this IDictionary<TKey,TValue> dictionary) 
{ 
    if (dictionary == null) 
     throw new ArgumentNullException("dictionary"); 

    var items = from kvp in dictionary 
       select kvp.Key + "=" + kvp.Value; 

    return "{" + string.Join(",", items) + "}"; 
} 

Ejemplo:

var dict = new Dictionary<int, string> 
{ 
    {4, "a"}, 
    {5, "b"} 
}; 

Console.WriteLine(dict.MyToString()); 

Salida:

{4=a,5=b} 
+0

aliento y especifique que es un método de extensión: D Me –

0

Puede recorrer las llaves del diccionario e imprimirlas junto con el valor ...

public string DictToString(Dictionary<string, string> dict) 
{ 
    string toString = ""; 
    foreach (string key in dict.Keys) 
    { 
      toString += key + "=" + dict[key]; 
    } 
    return toString; 
} 
-5

Lo que tienes que hacer, es crear una clase que se extiende Dictionary y sobrescribir el método ToString().

Nos vemos

+0

¿Puedo saber por qué alguien apuntó -1 a esto? :) gracias, si me equivoco, me gustaría saber dónde estoy equivocado. Gracias. – Amedio

+1

No descarté esta respuesta, pero no proporciona código de muestra. Además, la creación de subclases parece un martillo innecesario cuando puedes simplemente escribir un método de extensión como se muestra en algunas de las otras respuestas; esto también le permite llamar directamente al método de extensión en los diccionarios que obtiene de un código fuera de su control donde no podría simplemente usar su subclase. – Eliot

6

No es práctico. Tendrás que hacer el tuyo.

public static string ToPrettyString<TKey, TValue>(this IDictionary<TKey, TValue> dict) 
{ 
    var str = new StringBuilder(); 
    str.Append("{"); 
    foreach (var pair in dict) 
    { 
     str.Append(String.Format(" {0}={1} ", pair.Key, pair.Value)); 
    } 
    str.Append("}"); 
    return str.ToString(); 
} 
+1

Esto es útil ya que funciona en el código pre-.NET3.5 (sin soporte de linq) –

2

Recibí esta respuesta simple .. Use JavaScriptSerializer Clase para esto.

Y sólo tiene que llamar al método Serialize con objeto Dictionary como argumento.

Ejemplo:

var dct = new Dictionary<string,string>(); 
var js = new JavaScriptSerializer(); 
dct.Add("sam","shekhar"); 
dct.Add("sam1","shekhar"); 
dct.Add("sam3","shekhar"); 
dct.Add("sam4","shekhar"); 
Console.WriteLine(js.Serialize(dct)); 

Salida:

{"sam":"shekhar","sam1":"shekhar","sam3":"shekhar","sam4":"shekhar"} 
3

Si desea utilizar LINQ, que podría intentar algo como esto:

String.Format("{{{0}}}", String.Join(",", test.OrderBy(_kv => _kv.Key).Zip(test, (kv, sec) => String.Join("=", kv.Key, kv.Value)))); 

donde "prueba" es su diccionario . Tenga en cuenta que el primer parámetro para Zip() es solo un marcador de posición, ya que no se puede pasar un valor nulo.

Si el formato no es importante, tratar

String.Join(",", test.OrderBy(kv => kv.Key)); 

que le dará algo así como

[key,value], [key,value],... 
+0

Me gusta la expresión Linq @Tim proporcionó más. – seairth

52

Si simplemente desea realizar una serie de propósitos de depuración, el camino más corto es:

var asString = string.Join(";", dictionary); 

Esto funciona porque IDictionary<TKey, TValue> es ICollection<KeyValuePair<TKey, TValue>>.

+3

+1 No es muy bonito, pero funciona y es simple. –

+0

Funciona muy bien. Muchas gracias. –

+3

Brillante! ¿Donde ha estado esto toda mi vida? – Tony

0

Me gusta el enfoque de ShekHar_Pro para usar el serializador. La única recomendación es usar json.net para serializar en lugar del JavaScriptSerializer incorporado, ya que es más lento.

+1

Esto debería ser un comentario, no una respuesta. Espere hasta que tenga suficiente reputación para comentar en lugar de enviar correo basura a la sección de respuestas. – Chris

1

Otra solución:

var dic = new Dictionary<string, double>() 
{ 
    {"A", 100.0 }, 
    {"B", 200.0 }, 
    {"C", 50.0 } 
}; 

string text = dic.Select(kvp => kvp.ToString()).Aggregate((a, b) => a + ", " + b); 

Valor de texto: [A, 100], [B, 200], [C, 50]

Cuestiones relacionadas