题
的字符串来建立使用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);
}
不隶属于 StackOverflow