[英]How to append two stringBuilders?
有没有办法附加两个字符串构建器? 如果是这样 - 它的性能是否比将字符串附加到 StringBuilder 更好?
我知道这是三年后,但无论如何 .NET 4 StringBuilder
行为都不同。
尽管如此,它仍然回到“你想做什么?” 您是否只是在寻找附加两个StringBuilders
并继续使用后一个结果的最高效方法? 或者您是否希望继续使用附加的StringBuilder
的现有缓冲值?
对于前者,并且始终在 .NET 4 中,
frontStringBuilder.Append(backStringBuilder);
是最好的。
对于 .NET 2/3.5 中的后一种情况,
frontStringBuilder.Append(backStringBuilder.ToString(0, backStringBuilder.Length));
是最好的(并且不会损害 .NET 4 中的性能)。
就这样……
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
作为参数、字符串、int/string 等的构造函数。 StringBuilder
覆盖了.ToString()
,因此:
StringBuilder sb1 = new StringBuilder("1");
sb1.Append(new StringBuilder("2"));
Console.WriteLine(sb1);
该代码将自动调用.ToString()
覆盖版本。 输出将为"12"
;
2)如果StringBuilder
将作为传入参数去StringBuilder
构造函数在明年framework版本,你的代码将被清除,准备好没有任何重构正确的追加。
祝你有美好的一天!
就这么简单:
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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.