Стрингбилдер:как получить окончательную строку?
-
03-07-2019 - |
Вопрос
Кто-то сказал мне, что с помощью StringBuilder объединять строки быстрее.Я изменил свой код, но не вижу никаких свойств или методов для получения окончательной строки сборки.
Как я могу получить строку?
Решение
Вы можете использовать .ToString ()
, чтобы получить String
из StringBuilder
.
Другие советы
Когда вы говорите " быстрее объединять String с помощью String Builder " ;, это верно только в том случае, если вы неоднократно (я повторяю - неоднократно ) объединяетесь с тот же объект.
Если вы просто объединяете две строки и сразу что-то делаете с результатом в виде string
, нет смысла использовать StringBuilder
.
Я только что натолкнулся на приятное описание Джона Скита: http: // www. yoda.arachsys.com/csharp/stringbuilder.html р>
Если вы используете StringBuilder
, то для получения результирующей string
достаточно просто вызвать ToString ()
(неудивительно). р>
После завершения обработки с использованием StringBuilder используйте метод ToString, чтобы вернуть окончательный результат.
Из MSDN:
using System;
using System.Text;
public sealed class App
{
static void Main()
{
// Create a StringBuilder that expects to hold 50 characters.
// Initialize the StringBuilder with "ABC".
StringBuilder sb = new StringBuilder("ABC", 50);
// Append three characters (D, E, and F) to the end of the StringBuilder.
sb.Append(new char[] { 'D', 'E', 'F' });
// Append a format string to the end of the StringBuilder.
sb.AppendFormat("GHI{0}{1}", 'J', 'k');
// Display the number of characters in the StringBuilder and its string.
Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());
// Insert a string at the beginning of the StringBuilder.
sb.Insert(0, "Alphabet: ");
// Replace all lowercase k's with uppercase K's.
sb.Replace('k', 'K');
// Display the number of characters in the StringBuilder and its string.
Console.WriteLine("{0} chars: {1}", sb.Length, sb.ToString());
}
}
// This code produces the following output.
//
// 11 chars: ABCDEFGHIJk
// 21 chars: Alphabet: ABCDEFGHIJK
Я просто хотел бы выкинуть, что, возможно, не обязательно быстрее, у него определенно будет лучший след памяти. Это потому, что строка неизменна в .NET, и каждый раз, когда вы меняете строку, вы создаете новую.
О том, что память быстрее/лучше:
Я изучил эту проблему с помощью Java и предполагаю, что .NET справится с этим так же умно.
Реализация String впечатляет.
Объект String отслеживает «длину» и «общий доступ» (независимо от длины массива, содержащего строку).
Итак, что-то вроде
String a = "abc" + "def" + "ghi";
может быть реализован (компилятором/средой выполнения) как:
- Extend the array holding "abc" by 6 additional spaces. - Copy def in right after abc - copy ghi in after def. - give a pointer to the "abc" string to a - leave abc's length at 3, set a's length to 9 - set the shared flag in both.
Поскольку большинство строк недолговечны, во многих случаях это делает код ОЧЕНЬ эффективным.Случай, когда это абсолютно НЕ эффективно, - это когда вы добавляете к строке внутри цикла или когда ваш код выглядит следующим образом:
a = "abc";
a = a + "def";
a += "ghi";
В этом случае гораздо лучше использовать конструкцию StringBuilder.
Я хочу сказать, что вам следует быть осторожными при каждой оптимизации, если только вы АБСОЛЮТНО не уверены, что знаете, что делаете, И вы абсолютно уверены, что это необходимо, И вы тестируете, чтобы убедиться, что оптимизированный код проходит вариант использования, просто запишите его. максимально читабельным способом и не пытайтесь перехитрить компилятор.
Я потратил 3 дня на возню со строками, кеширование/повторное использование построителей строк и тестирование скорости, прежде чем посмотрел исходный код строки и понял, что компилятор уже делает это лучше, чем я мог бы для моего варианта использования.Затем мне пришлось объяснить, что я ДЕЙСТВИТЕЛЬНО не понимал, что делаю, я только думал, что знаю...
Объединение не происходит быстрее. Как отметил Смаклелл, проблема заключается в том, что неизменяемая строка требует дополнительного выделения и повторного копирования существующих данных.
"a"+"b"+"c" не быстрее при использовании построителя строк, но повторяющиеся конкаты с промежуточной строкой становятся все быстрее и быстрее по мере увеличения количества конкатов, например:
х = «а»;х+="б";х+="с";...