如何附加两个stringBuilders?

Ela*_*nda 45 c# stringbuilder

有没有办法追加两个字符串构建器?如果是这样 - 它是否比将字符串附加到StringBuilder更好?

Mar*_*urd 31

我知道这是三年之后,但StringBuilder无论如何.NET 4的表现都不同.

尽管如此,它仍然会回到"你想做什么?" 您是否正在寻找最有效的方法来追加两个StringBuilders并继续使用后者的结果?或者您是否希望继续使用附加的现有缓冲值StringBuilder

对于前者,始终在.NET 4中,

frontStringBuilder.Append(backStringBuilder);
Run Code Online (Sandbox Code Playgroud)

是最好的.

对于.NET 2/3.5中的后一种情况,

frontStringBuilder.Append(backStringBuilder.ToString(0, backStringBuilder.Length));
Run Code Online (Sandbox Code Playgroud)

是最好的(并且不会损害.NET 4中的性能).

  • 在引擎盖下`frontStringBuilder.Append(backStringBuilder)`里面调用`backStringBuilder.toString()`.所以它基本上是`frontStringBuilder.Append(backStringBuilder.ToString())`. (6认同)
  • @rovsen 是的,这就是我所拥有的,直到 Nigrimmist 指出,未来“StringBuilder”直接重载的可能性变得可用会更好。 (2认同)

Gau*_*wal 20

就像那样....

StringBuilder sb = new StringBuilder();
StringBuilder sb1 = new StringBuilder();
sb.Append(sb1.ToString());
Run Code Online (Sandbox Code Playgroud)

  • 这是一个字符串附加到某人.我想附加到sb以避免将sb密封到弦上 (35认同)

Ond*_*lka 20

这将在没有分配的情况下完成

StringBuilder sb = new StringBuilder("aaaa");    
StringBuilder second = new StringBuilder("bbbbb");
sb.EnsureCapacity(sb.Length + second.Length);
for (int i = 0; i < second.Length; i++)
{
    sb.Append(second[i]);
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,`StringBuilder` 中的索引器属性并不简单,实际上会迭代 StringBuilder 内的每个“块”以进行**每个**访问,这使得在循环中使用它有点昂贵。对于我的实现,如果“StringBuilder”长度超过 ~4,000 个字符,我使用可重用的“Char[]”缓冲区。 (3认同)

Nig*_*ist 10

您不需要调用.ToString().你应该简单地将一个追加到另一个.就这样.对于直接.ToString()调用它会更好,原因如下:

1)StringBuilder没有StringBuilder的构造函数作为param,string,int/string等.CtringBuilder重写.ToString(),结果如下:

StringBuilder sb1 = new StringBuilder("1");
sb1.Append(new StringBuilder("2"));
Console.WriteLine(sb1);
Run Code Online (Sandbox Code Playgroud)

该代码将自动调用.ToString()的覆盖版本.输出为"12";

2)如果StringBuilder将作为传入参数添加到下一个框架版本中的StringBuilder构造函数中,那么您的代码将清晰并准备好进行正确的追加而不进行任何重构.

祝你有美好的一天!


Dum*_*y01 6

就像那样:

firstStringBuilder.Append(secondStringBuilder.ToString());
Run Code Online (Sandbox Code Playgroud)


Rol*_*sen 6

如果 StringBuilder 很大,那么这将最大限度地减少字符串分配(特别是如果您可以提供可重用的字符缓冲区):

    public static void CopyTo(this StringBuilder source, StringBuilder dest)
    {
        char[] buffer = new char[Math.Min(source.Length, 1024)];
        CopyTo(source, dest, buffer);
    }

    public static void CopyTo(this StringBuilder source, StringBuilder dest, char[] buffer)
    {
        dest.EnsureCapacity(dest.Length + source.Length);
        for (int i = 0; i < source.Length; i += buffer.Length)
        {
            int charCount = Math.Min(source.Length - i, buffer.Length);
            source.CopyTo(i, buffer, 0, charCount);
            dest.Append(buffer, 0, charCount);
        }
    }
Run Code Online (Sandbox Code Playgroud)