如何附加两个stringBuilder?

问题描述 投票:0回答:7

有没有办法追加两个字符串生成器? 如果是这样,它的性能是否比将字符串附加到 StringBuilder 更好?

c# stringbuilder
7个回答
43
投票

我知道这是三年后的事了,但 .NET 4

StringBuilder
的行为无论如何都不同。

尽管如此,它仍然回到“你想做什么?”您是否只是在寻找附加两个

StringBuilders
并继续仅使用后一个结果的最高效方法?或者您是否希望继续使用附加的
StringBuilder
的现有缓冲值?

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

frontStringBuilder.Append(backStringBuilder);

最好了。

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

frontStringBuilder.Append(backStringBuilder.ToString(0, backStringBuilder.Length));

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


24
投票

就这样......

StringBuilder sb = new StringBuilder();
StringBuilder sb1 = new StringBuilder();
sb.Append(sb1.ToString());

19
投票

这将无需分配即可完成

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]);
}

14
投票

您不需要打电话

.ToString()
。您应该简单地将一个附加到另一个。就这样。出于下一个原因,最好不要直接打电话
.ToString()
:

1) StringBuilder 没有以

StringBuilder
作为参数、字符串、int/string 等的构造函数。
StringBuilder
覆盖
.ToString()
,结果 :

StringBuilder sb1 = new StringBuilder("1");
sb1.Append(new StringBuilder("2"));
Console.WriteLine(sb1);

该代码将自动调用

.ToString()
的重写版本。输出将为
"12"
;

2)如果

StringBuilder
将作为传入参数添加到下一个框架版本中的
StringBuilder
构造函数,您的代码将变得清晰并准备好正确附加,而无需任何重构。

祝你有美好的一天!


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);
        }
    }

4
投票

就这么简单:

firstStringBuilder.Append(secondStringBuilder.ToString());

0
投票

firstStringBuilder.Append(secondStringBuilder.ToString()); 对我有用

© www.soinside.com 2019 - 2024. All rights reserved.