C# 在c中构建字符串的优雅方法#
使用keyvaluepair构建的字符串如下:“name1=v1&name2=v2&name3=v3” 我在做什么:C# 在c中构建字符串的优雅方法#,c#,stringbuilder,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 u
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);
任何避免最后删除“&”符号的优雅方法?至少您可以通过执行
--sb.Length在ToString()调用之前删除&
符号代码>
foreach (var name in nameValues)
{
if (sb.Length > 0) sb.Append("&");
sb.AppendFormat("{0}={1}", name.Key, name.Value);
}
只需在需要时添加“&”,不要将其从末尾移除。查看此处:;引述:
private string ToQueryString(NameValueCollection nvc)
{
return "?" +
string.Join("&",
Array.ConvertAll(
nvc.AllKeys,
key => String.Format("{0}={1}", HttpUtility.UrlEncode(key),
HttpUtility.UrlEncode(nvc[key]))));
}
var sb=new StringBuilder();
sb.AppendFormat(“{0}={1}”,nameValues[0]。键,nameValues[0]。值);
for(int i=1;i
以下是我有时使用的另一种方法:
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();
假设我们没有连接到一个大字符串(我们生成了许多小字符串),那么在这种情况下,连接不会带来性能损失。NET中的字符串都是长度前缀,因此整个连接性能问题不如C中的那么重要。String.Join()也非常快,比StringBuilder快
TLDR:使用String.Join()
我倾向于使用这种方法,利用这样一个事实,您可以使用长度属性上的减量来截断字符串生成器:
var sb = new StringBuilder();
foreach (var name in nameValues)
{
sb.AppendFormat("{0}={1}&", name.Key, name.Value);
}
if (sb.Length > 0) sb.Length--;
我认为这是最好的方法,它可以避免对下面显示的每个迭代进行额外的检查。cuil!如果作为扩展方法访问,这看起来会更酷。是否有可以保存字符串、对象对的NameValueCollection?您不能使用字典?第一个附录格式上的小打字错误-它不需要“&”。如果保证至少有一个条目,此方法非常有效。您忘记了Select中的“n=>”。var joined=String.Join(“&”,nameValues.Select(n=>String.Concat(n.Key,“=”,n.Value)).ToArray();氦:是的,我知道我已经修好了。我还没有100%醒来。如果速度是个问题,请使用sb.Append(name.Key).Append(“=”).Append(name.Value);您还可以使用“&{0}={1}”
并使用sb.ToString(1,sb.Length-1)去除第一个字符
var joined =
String.Join("&", nameValues.Select(n => n.Key + "=" + n.Value).ToArray());
var sb = new StringBuilder();
foreach (var name in nameValues)
{
sb.AppendFormat("{0}={1}&", name.Key, name.Value);
}
if (sb.Length > 0) sb.Length--;