如何附加两个stringBuilders?

时间:2011-06-23 13:00:44

标签: c# stringbuilder

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

6 个答案:

答案 0 :(得分:29)

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

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

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

frontStringBuilder.Append(backStringBuilder);

是最好的。

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

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

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

答案 1 :(得分: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]);
}

答案 2 :(得分:19)

就像那样......

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

答案 3 :(得分:9)

您无需调用.ToString()。你应该简单地将一个追加到另一个。就这样。最好不要直接使用.ToString()调用,原因如下:

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

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

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

2)如果在下一个框架版本中将StringBuilder作为传入参数添加到StringBuilder构造函数中,那么您的代码将清晰可用,无需任何重构即可正确添加。

祝你有个美好的一天!

答案 4 :(得分:6)

就像那样:

firstStringBuilder.Append(secondStringBuilder.ToString());

答案 5 :(得分:1)

如果StringBuilder很大,那么这将最小化字符串分配(特别是如果你可以提供一个可重用的char-buffer):

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