Как добавить два stringBuilders? - PullRequest
43 голосов
/ 23 июня 2011

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

Ответы [ 6 ]

28 голосов
/ 09 июля 2014

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

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

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

frontStringBuilder.Append(backStringBuilder);

лучший.

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

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

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

20 голосов
/ 22 февраля 2013

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

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]);
}
19 голосов
/ 23 июня 2011

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

StringBuilder sb = new StringBuilder();
StringBuilder sb1 = new StringBuilder();
sb.Append(sb1.ToString());
9 голосов
/ 07 мая 2015

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

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

6 голосов
/ 23 июня 2011

Просто так:

firstStringBuilder.Append(secondStringBuilder.ToString());
2 голосов
/ 02 апреля 2017

Если StringBuilder большой, то это минимизирует выделение строк (особенно, если вы можете предоставить многоразовый char-буфер):

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