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?

Foi útil?

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);
} 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top