Domanda

stringa di costruire utilizzando KeyValuePair è come questo: "nome1 = v1 & nome2 = v2 e v3 NAME3 ="

quello che sto facendo:

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

alcun modo elegante per evitare l'ultima affermazione rimozione del '&' firmare?

È stato utile?

Soluzione

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

Dato che non stiamo concatenando ad una grande stringa (stiamo producendo molti piccoli archi) concatenazione comporta nessuna sanzione performace in questo caso. E nelle stringhe .NET sono lunghezza prefisso comunque così l'intero problema di prestazioni concatenazione è meno rilevante che in C. String.Join () è molto veloce e, più veloce di StringBuilder.

TLDR: Usa String.Join()

Altri suggerimenti

Date un'occhiata qui: Come costruire una stringa di query per un URL in 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);
     }

Basta aggiungere "&" quando necessario, non rimuoverlo dalla fine.

Ecco un altro approccio che ho usato a volte:

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

E 'solo un modo di precedere e prima di ogni coppia di diverso da prima senza utilizzare un test condizionale.

Se si desidera utilizzare la vostra idea originale che tagliare l'StringBuilder a proposito, io suggerirei il seguente codice invece:

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

Io tendo ad usare questo, utilizzando il fatto è possibile troncare un costruttore stringa con un decremento sulla proprietà length:

var sb = new StringBuilder();

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

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

Beh, almeno è possibile rimuovere il segno & prima della chiamata ToString() facendo --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);
} 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top