10

使用键值对构建的字符串如下所示:“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);

有什么优雅的方法可以避免“&”符号的最后一个删除语句?

4

7 回答 7

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

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

TLDR:使用String.Join()

于 2010-01-06T11:04:50.583 回答
5

看看这里:如何在 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]))));
}
于 2010-01-06T11:01:44.233 回答
4
foreach (var name in nameValues)
    {
        if (sb.Length > 0) sb.Append("&");
                sb.AppendFormat("{0}={1}", name.Key, name.Value);
     }

只需在需要时添加“&”,不要从末尾删除它。

于 2010-01-06T11:01:10.460 回答
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();
于 2010-01-06T11:04:02.423 回答
3

我倾向于使用它,利用您可以截断字符串构建器并减少长度属性的事实:

var sb = new StringBuilder();

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

if (sb.Length > 0) sb.Length--;
于 2010-01-06T11:15:51.383 回答
1

好吧,至少您可以在通话&前通过以下方式删除标志ToString()--sb.Length;

于 2010-01-06T11:00:11.367 回答
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);
} 
于 2010-01-06T11:01:44.250 回答