Ответ 1
Зачем вам нужно преобразовать StringBuilder
в String
в первую очередь? Как вы уже отметили, вы можете передать StringBuilder
непосредственно в методы рисования XNA. Вы также можете использовать StringBuilder
для получения подстрок:
substringBuilder.Length = 0;
for (int i = start; i <= end; i++)
substringBuilder.Append(originalBuilder[i]);
Единственными вещами, которые вы хотите избежать с помощью Обновление: я ошибся. Напишите свои собственные методы расширения. Сводка доступна здесь: Избегайте мусора при работе с StringBuilderStringBuilder
, являются ToString()
и AppendFormat()
. Ни один из других методов форматирования (насколько мне известно) не генерирует мусор.
Относительно легко написать метод, который разбивает строку на подстроки на основе заданного разделителя. Просто помните, что 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;
}