un modo elegante per creare la stringa in C #
-
19-09-2019 - |
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?
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);
}