Зачем вам нужно конвертировать StringBuilder
в String
?Как вы заметили, вы можете передать StringBuilder
непосредственно в методы рисования XNA.Вы также можете использовать StringBuilder
для извлечения подстрок:
substringBuilder.Length = 0;
for (int i = start; i <= end; i++)
substringBuilder.Append(originalBuilder[i]);
Единственные вещи, которые вы хотите избежать с помощью StringBuilder
, это ToString()
и AppendFormat()
.Ни один из других методов форматирования (насколько мне известно) не генерирует мусор. Обновление: я ошибся.Напишите свои собственные методы расширения.Краткое описание доступно здесь: Как избежать мусора при работе с StringBuilder
Относительно легко написать метод, который разделит строку на подстроки на основе заданного разделителя.Просто помните, что String.Split()
является злом по двум причинам - во-первых, потому что он выделяет новые строки;и второе, потому что выделяет новый массив .Неизменность строк - это только половина вашей проблемы.
Рассмотрим следующие методы расширения для StringBuilder
.Я не полностью протестировал этот код, но он должен дать вам общее представление.Обратите внимание, что он ожидает, что вы передадите предварительно выделенный массив, который затем будет заполнен.
public static void Substring(this StringBuilder source, Int32 start, Int32 count, StringBuilder output)
{
output.Length = 0;
for (int i = start; i < start + count; i++)
{
output.Append(source[i]);
}
}
public static int Split(this StringBuilder source, Char delimiter, StringBuilder[] output)
{
var substringCount = 0;
var substringStart = 0;
for (int i = 0; i < source.Length; i++)
{
if (source[i] == delimiter)
{
source.Substring(substringStart, i - substringStart, output[substringCount]);
substringCount++;
substringStart = i + 1;
}
}
if (substringStart < source.Length - 1)
{
source.Substring(substringStart, source.Length - substringStart, output[substringCount]);
substringCount++;
}
return substringCount;
}