在c#中构建字符串的优雅方式

时间:2010-01-06 10:56:20

标签: c# stringbuilder

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

任何优雅的方式,以避免'&'的最后删除声明登录?

7 个答案:

答案 0 :(得分:18)

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

鉴于我们没有连接到一个大字符串(我们生成许多小字符串),在这种情况下,连接不会产生性能损失。并且在.NET中,字符串的长度前缀无论如何都是如此,因此整个连接性能问题与C语言相关性较低.String.Join()也非常快,比StringBuilder更快。

TLDR:使用String.Join()

答案 1 :(得分:5)

看看这里:How to build a query string for a URL in 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]))));
}

答案 2 :(得分:4)

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

只需添加“&”需要时,不要将其从末端移除。

答案 3 :(得分:3)

这是我有时会使用的另一种方法:

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

答案 4 :(得分:3)

我倾向于使用这个,利用你可以截断字符串构建器并减去length属性的事实:

var sb = new StringBuilder();

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

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

答案 5 :(得分:1)

至少你可以通过&

ToString()来电之前删除--sb.Length;个符号

答案 6 :(得分:0)

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