的字符串来建立使用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);

任何优雅的方式来避免“和”最后去除声明签字?

有帮助吗?

解决方案

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

由于我们没有串联到一个大的字符串(我们生产许多小弦)串联携带在这种情况下,没有服务表现的惩罚。和在.NET串长度前缀无论如何所以整个级联性能问题比C.的string.join(不太相关的)是非常快的,以及,比StringBuilder的速度更快。

<强> TLDR:使用String.Join()

其他提示

在这里看看:如何建立在C#中的URL查询字符串?;引用:

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

只需添加“&”在需要时,不从端部卸下。

下面是我已经有时使用另一种方法:

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

我倾向于使用这一点,利用这样的事实可以截断的字符串生成器上的长度特性的减量:

var sb = new StringBuilder();

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

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

嗯,至少你可以做&ToString()调用之前删除--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);
} 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top