Как добавить два stringBuilders?

Есть ли способ добавить два строковых построек? И если да - работает ли он лучше, чем добавление строки в StringBuilder?

Ответ 1

Просто так....

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

Ответ 2

Я знаю, что это три года спустя, но .NET 4 StringBuilder ведет себя по-другому.

Тем не менее, он все еще возвращается к тому, "что вы хотите сделать?" Вы ищете просто самый эффективный способ добавления двух StringBuilders и продолжения только с последним результатом? Или вы ожидаете продолжить работу с существующим буферизованным значением добавленного StringBuilder?

Для первого и всегда в .NET 4,

frontStringBuilder.Append(backStringBuilder);

лучше.

Для последнего сценария в .NET 2/3.5,

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

является лучшим (и не повредит производительность в .NET 4).

Ответ 3

Это будет сделано без выделения

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

Ответ 4

Вам не нужно вызывать .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 в следующих версиях каркаса, ваш код будет ясным и готов для правильного добавления без каких-либо рефакторинга.

Хорошего дня!

Ответ 5

Просто как это:

firstStringBuilder.Append(secondStringBuilder.ToString());

Ответ 6

Если 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);
        }
    }

Ответ 7

Вы можете сделать это,

bool flag = false;
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("The value of the flag is ").Append(flag).Append(".");

Источник MSDN.