如何附加两个字符串生成器

本文关键字:字符串 两个 何附加 | 更新日期: 2023-09-27 18:00:15

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

如何附加两个字符串生成器

我知道这是三年后的事了,但.NET 4 StringBuilder的行为无论如何都不一样。

尽管如此,它仍然回到了"你想做什么?"你是否在寻找添加两个StringBuilders并继续使用后一个结果的最具性能的方法?还是您希望继续使用附加的StringBuilder的现有缓冲值?

对于前者,并且总是在.NET 4中,

frontStringBuilder.Append(backStringBuilder);

是最好的。

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

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

是最好的(并且不会影响.NET4中的性能)。

就是这样。。。。

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

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

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

您不需要调用.ToString()。您应该简单地将一个附加到另一个。仅此而已。它将更好地对抗直接的.ToString()呼叫,因为下一个原因:

1) StringBuilder没有StringBuilder作为param、string、int/string等的构造函数。StringBuilder覆盖.ToString(),结果:

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

该代码将自动调用CCD_ 9的重写版本。输出为"12"

2) 如果在下一个框架版本中,StringBuilder将作为传入参数添加到StringBuilder构造函数中,那么您的代码将是清晰的,可以在不进行任何重构的情况下进行正确的追加。

祝你今天过得愉快!

简单地说:

firstStringBuilder.Append(secondStringBuilder.ToString());

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