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

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

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

任何避免最后删除“&”符号的优雅方法?

至少您可以通过执行
--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--;