Для загального використання рішення, що включають клас 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) - швидкість, що збільшується логарифмічно з кількістю повторів (подвоєння кількості повторів дорівнює одній додатковій ітерації), істотна економія порівняно з іншими методами, які пропорційно збільшуються.