изящный способ создать строку в c#

представьте в виде строки для создания, использование 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);

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

10
задан Yacoby 6 January 2010 в 11:01
поделиться

7 ответов

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

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

TLDR: Use String.Join()

18
ответ дан 3 December 2019 в 14:24
поделиться

Взгляните сюда: Как построить строку запроса для URL на C#?; Цитирование:

private string ToQueryString(NameValueCollection nvc)
{
    return "?" + 
        string.Join("&", 
            Array.ConvertAll(
                nvc.AllKeys, 
                key => String.Format("{0}={1}", HttpUtility.UrlEncode(key),
                HttpUtility.UrlEncode(nvc[key]))));
}
5
ответ дан 3 December 2019 в 14:24
поделиться
foreach (var name in nameValues)
    {
        if (sb.Length > 0) sb.Append("&");
                sb.AppendFormat("{0}={1}", name.Key, name.Value);
     }

Просто добавляйте "&", когда нужно, не удаляйте его с конца.

4
ответ дан 3 December 2019 в 14:24
поделиться

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

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();
3
ответ дан 3 December 2019 в 14:24
поделиться

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

var sb = new StringBuilder();

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

if (sb.Length > 0) sb.Length--;
3
ответ дан 3 December 2019 в 14:24
поделиться

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

1
ответ дан 3 December 2019 в 14:24
поделиться
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);
} 
0
ответ дан 3 December 2019 в 14:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: