Pregunta

string para construir utilizando KeyValuePair es así: "nombre1 = v1 y v2 = nombre2 y nombre3 = v3"

lo que estoy haciendo:

var sb = new StringBuilder();

foreach (var name in nameValues)
{
            sb.AppendFormat("{0}={1}&", name.Key, name.Value);
 } 

//remove last '&' sign, this is what i think is ugly
sb.ToString().Remove(lastIndex);

cualquier manera elegante de evitar la última declaración eliminación de '&' firmar?

¿Fue útil?

Solución

var joined =
    String.Join("&", nameValues.Select(n => n.Key + "=" + n.Value).ToArray());

Dado que no estamos concatenando a una cadena grande (que estamos produciendo muchas cadenas pequeñas) concatenación no conlleva sanciones performace en este caso. Y en las cadenas de .NET se prefija longitud de todas formas por lo que todo el problema de rendimiento de concatenación es menos relevante que en C. string.join () es muy rápido, así, más rápido que StringBuilder.

TLDR: Uso String.Join()

Otros consejos

Tome un vistazo aquí: Cómo construir una cadena de consulta para una dirección URL en C # ?; Citando:

private string ToQueryString(NameValueCollection nvc)
{
    return "?" + 
        string.Join("&", 
            Array.ConvertAll(
                nvc.AllKeys, 
                key => String.Format("{0}={1}", HttpUtility.UrlEncode(key),
                HttpUtility.UrlEncode(nvc[key]))));
}
foreach (var name in nameValues)
    {
        if (sb.Length > 0) sb.Append("&");
                sb.AppendFormat("{0}={1}", name.Key, name.Value);
     }

Sólo tiene que añadir "y" cuando sea necesario, no se elimina de final.

Aquí hay otro enfoque que he usado a veces:

var sb = new StringBuilder();
string prefix = "";
foreach (var name in nameValues)
{
    sb.Append(prefix);
    prefix = "&";
    sb.AppendFormat("{0}={1}", name.Key, name.Value);
}

Es sólo una forma de anteponiendo y antes de cada par que no sea la primera de ellas sin necesidad de utilizar una prueba condicional.

Si desea utilizar su idea original de recortar el StringBuilder por cierto, me gustaría sugerir el código siguiente en su lugar:

sb.Length--; // Remove the last character
return sb.ToString();

Yo tiendo a usar esto, utilizando el hecho de que puede truncar un constructor de cadena con un decremento en la propiedad de longitud:

var sb = new StringBuilder();

foreach (var name in nameValues)
{
    sb.AppendFormat("{0}={1}&", name.Key, name.Value);
} 

if (sb.Length > 0) sb.Length--;

Bueno, al menos se puede quitar el signo & antes de la llamada ToString() haciendo --sb.Length;

var sb = new StringBuilder();

sb.AppendFormat("{0}={1}", nameValues[0].Key, nameValues[0].Value);

for (int i = 1; i < nameValues.Count; i++)
{
        sb.AppendFormat("&{0}={1}", nameValues[i].Key, nameValues[i].Value);
} 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top