uma maneira elegante de construir a corda no c #
-
19-09-2019 - |
Pergunta
string para construir usando KeyValuePair é assim: "name1 = v1 & name2 = v2 e v3 nome3 ="
o que eu estou fazendo:
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);
qualquer maneira elegante para evitar a última declaração remoção de 'e' sinal?
Solução
var joined =
String.Join("&", nameValues.Select(n => n.Key + "=" + n.Value).ToArray());
Tendo em conta que não estamos concatenando a um grande string (estamos produzindo muitas pequenas cordas) concatenação carrega nenhuma penalidade performace neste caso. E em .NET cordas são comprimento prefixado de qualquer maneira para todo o problema de desempenho de concatenação é menos relevante do que em C. String.Join () é muito rápido, bem como, mais rápido do que StringBuilder.
TLDR: Use String.Join()
Outras dicas
Dê uma olhada aqui: Como construir uma string de consulta para uma URL em 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 adicionar "&" quando necessário, não removê-lo a partir do final.
Aqui está uma outra abordagem que eu usei algumas vezes:
var sb = new StringBuilder();
string prefix = "";
foreach (var name in nameValues)
{
sb.Append(prefix);
prefix = "&";
sb.AppendFormat("{0}={1}", name.Key, name.Value);
}
É apenas uma maneira de prepending & antes de cada par que não seja o primeiro sem o uso de um teste condicional.
Se você quiser usar o seu idéia original de aparar a StringBuilder
pelo caminho, eu sugiro o seguinte código em vez disso:
sb.Length--; // Remove the last character
return sb.ToString();
I tendem a usar este, utilizando o fato de que você pode truncar um construtor string com um decréscimo na propriedade comprimento:
var sb = new StringBuilder();
foreach (var name in nameValues)
{
sb.AppendFormat("{0}={1}&", name.Key, name.Value);
}
if (sb.Length > 0) sb.Length--;
Bem, pelo menos você pode remover o sinal &
antes da chamada ToString()
fazendo --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);
}