Для общего использования решения, включающие класс StringBuilder, лучше всего подходят для повторения многосимвольных строк. Он оптимизирован для обработки комбинации большого количества строк так, как это не может сделать простая конкатенация, и что было бы трудно или невозможно сделать более эффективно вручную. Решения StringBuilder, показанные здесь, используют O (N) итераций для завершения, фиксированная скорость, пропорциональная количеству повторений.
Тем не менее, для очень большого числа повторов, или когда из него нужно выжать высокий уровень эффективности, лучшим подходом будет сделать нечто похожее на базовую функциональность StringBuilder, но производить дополнительные копии из места назначения, а не из исходной строки, как ниже.
public static string Repeat_CharArray_LogN(this string str, int times)
{
int limit = (int)Math.Log(times, 2);
char[] buffer = new char[str.Length * times];
int width = str.Length;
Array.Copy(str.ToCharArray(), buffer, width);
for (int index = 0; index < limit; index++)
{
Array.Copy(buffer, 0, buffer, width, width);
width *= 2;
}
Array.Copy(buffer, 0, buffer, width, str.Length * times - width);
return new string(buffer);
}
Это удваивает длину строки источника / назначения с каждой итерацией, что экономит накладные расходы на сброс счетчиков при каждом прохождении исходной строки, вместо этого плавно читая и копируя теперь гораздо более длинную строку, что современные процессоры могут сделать очень много более эффективно.
Он использует логарифм base-2, чтобы найти, сколько раз ему нужно удвоить длину строки, а затем продолжает делать это столько раз. Поскольку остаток, подлежащий копированию, теперь меньше общей длины, с которой он копируется, он может просто скопировать подмножество того, что уже сгенерировано.
Я использовал метод Array.Copy (), а не StringBuilder, так как копирование содержимого StringBuilder в себя потребовало бы создания новой строки с этим содержимым с каждой итерацией. Array.Copy () избегает этого, все еще работая с чрезвычайно высокой эффективностью.
Это решение требует O (1 + log N) итераций для завершения, скорость, которая логарифмически увеличивается с числом повторений (удвоение числа повторов равно одной дополнительной итерации), что существенно экономит по сравнению с другими методами, которые увеличиваются пропорционально.