2つの文字列ビルダーを追加する方法はありますか?そして、もしそうなら-StringBuilderに文字列を追加するよりも優れていますか?
そのように....
StringBuilder sb = new StringBuilder();
StringBuilder sb1 = new StringBuilder();
sb.Append(sb1.ToString());
これは3年後ですが、.NET 4 StringBuilder
の動作はとにかく異なります。
それでも、「何をしたいのか」に戻ってきます。 2つのStringBuilders
を追加し、後者の結果だけを続行する最も単純な方法を探していますか?または、追加されたStringBuilder
の既存のバッファリングされた値を引き続き使用する予定ですか?
前者については、常に.NET 4で
frontStringBuilder.Append(backStringBuilder);
最高です。
.NET 2/3.5の後者のシナリオでは、
frontStringBuilder.Append(backStringBuilder.ToString(0, backStringBuilder.Length));
最適です(.NET 4でパフォーマンスを損なうことはありません)。
これは割り当てなしでそれを行います
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()を呼び出す必要はありません。単純に1つを追加する必要があります。それで全部です。次の理由により、直接の.ToString()呼び出しよりも優れています。
1)StringBuilderには、StringBuilderをparam、string、int/stringなどとして使用するコンストラクタはありません。StringBuilderは.ToString()をオーバーライドし、その結果として:
StringBuilder sb1 = new StringBuilder("1");
sb1.Append(new StringBuilder("2"));
Console.WriteLine(sb1);
このコードは、オーバーライドされたバージョンの.ToString()を自動的に呼び出します。出力は「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);
}
}