Convertir Diccionario <cadena, cadena> a cadena separada por punto y coma en c #


135

Uno simple para comenzar el día, dado el Dictionary<string, string>siguiente:

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

Deseo crear una cadena: "A=1;B=2;C=3;D=4"

Un ejemplo de implementación:

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

Tenga en cuenta que es probable que el diccionario tenga menos de 10 elementos, lo que sugiere que un StringBuilder es excesivo.

¿Qué implementaciones alternativas son más sucintas / eficientes? ¿El marco tiene alguna característica que ayude?

Respuestas:


290
using System.Linq;

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

(Y si está utilizando .NET 4, o más reciente, puede omitir la ToArrayllamada final ).


Agradable :-) Sin embargo, usaría String.Format ("{0} = {1}", x.Key, x.Value) en lugar del operador +
Amittai Shapira

77
@Amittai, @the_drow: Quizás prefieras string.Format; Prefiero k+"="+vlas concatenaciones simples como esta. Cada uno a lo suyo, supongo ...
LukeH

2
Tenga en cuenta que la llamada a ToArray()no es necesaria. Eliminarlo da como resultado una llamada a en String.Join<String>(String, IEnumerable<String>)lugar de String.Join(String, String[]).
Dan Stevens

8
Si no le importa el formato de salida exacto, puede hacerlo string.Join(", ", myDict). Saldrá en la forma[A, 1], [B, 2], [C, 3], [D, 4]
altumano

2
@SRJ Empty es muy diferente de Null .... Empty "", o Whitespace " ", son claves válidas en un Diccionario. Aunque tampoco se recomienda su uso, son valores válidos. Debe hacer una ContainsKeycomprobación si necesita un Nombre de clave específico o la construcción del lenguaje equivalente foreachpara capturar los valores.
GoldBishop

39

Otra opción es usar la extensión Agregado en lugar de Unir:

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

estilo linq perfecto!
menkow

1

Para que Linq funcione Dictionarynecesita al menos .Net v3.5 y using System.Linq;.

Algunas alternativas:

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}"));

Si no puede usar Linq por alguna razón, use 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

Esta es la misma respuesta que @LukeH tiene arriba.
Rick Glos

amigo, no es lo mismo, no hay necesidad de usar ToArray (). Por favor, no desestime mi respuesta.
Jaydeep Shil

2
Es lo mismo: menciona la eliminación de ToArray()cuando se usan versiones superiores del marco.
Rick Glos
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.