web-dev-qa-db-ja.com

2つのstringBuilderを追加する方法は?

2つの文字列ビルダーを追加する方法はありますか?そして、もしそうなら-StringBuilderに文字列を追加するよりも優れていますか?

45
Elad Benda

そのように....

StringBuilder sb = new StringBuilder();
StringBuilder sb1 = new StringBuilder();
sb.Append(sb1.ToString());
19
Gaurav Agrawal

これは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でパフォーマンスを損なうことはありません)。

31
Mark Hurd

これは割り当てなしでそれを行います

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

.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が追加される場合、コードは明確になり、リファクタリングなしで正しく追加できるようになります。

良い一日を過ごしてください!

10
Nigrimmist

単にそのように:

firstStringBuilder.Append(secondStringBuilder.ToString());
6
Dummy01

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);
        }
    }
2
Rolf Kristensen