Элегантный способ построения строки в С#

Строка

для создания с использованием keyvaluepair выглядит следующим образом: "name1 = v1 & name2 = v2 & name3 = v3"

что я делаю:

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

любой элегантный способ избежать последней инструкции удаления '&' знак?

Ответ 1

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

Учитывая, что мы не объединяемся с одной большой строкой (мы производим много маленьких строк), конкатенация не несет никаких штрафных санкций в этом случае. И в .NET строки имеют длину префикса в любом случае, поэтому проблема с общей конкатенационной характеристикой менее актуальна, чем в C. String.Join() также очень быстро, быстрее, чем StringBuilder.

TL;DR: Используйте String.Join()

Ответ 3

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

Просто добавьте "&" при необходимости не удаляйте его с конца.

Ответ 4

Вот еще один подход, который я иногда использовал:

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

Это просто способ добавления и перед каждой парой, отличной от первой, без использования условного теста.

Если вы хотите использовать свою оригинальную идею обрезки StringBuilder, кстати, я бы предложил вместо этого следующий код:

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

Ответ 5

Я использую это, используя тот факт, что вы можете обрезать построитель строк с декрементом в свойстве length:

var sb = new StringBuilder();

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

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

Ответ 6

Ну, по крайней мере, вы можете удалить знак & перед вызовом ToString(), выполнив --sb.Length;

Ответ 7

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