Für den allgemeinen Gebrauch eignen sich Lösungen mit der StringBuilder-Klasse am besten zum Wiederholen von Zeichenfolgen mit mehreren Zeichen. Es ist optimiert, um die Kombination einer großen Anzahl von Zeichenfolgen auf eine Weise zu handhaben, die eine einfache Verkettung nicht kann und die von Hand nur schwer oder gar nicht effizienter durchgeführt werden kann. Die hier gezeigten StringBuilder-Lösungen verwenden zum Abschluss O (N) -Iterationen, eine Flatrate, die proportional zur Häufigkeit der Wiederholung ist.
Für eine sehr große Anzahl von Wiederholungen oder wenn ein hohes Maß an Effizienz herausgepresst werden muss, ist es jedoch besser, etwas Ähnliches wie die Grundfunktionalität von StringBuilder zu tun, aber zusätzliche Kopien vom Ziel anstatt von der ursprünglichen Zeichenfolge zu erstellen. wie nachstehend.
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);
}
Dies verdoppelt die Länge der Quell- / Zielzeichenfolge bei jeder Iteration, wodurch der Aufwand für das Zurücksetzen von Zählern bei jedem Durchlaufen der ursprünglichen Zeichenfolge gespart wird. Stattdessen kann die jetzt viel längere Zeichenfolge problemlos gelesen und kopiert werden, was moderne Prozessoren viel tun können effizienter.
Es verwendet einen Basis-2-Logarithmus, um zu ermitteln, wie oft die Länge der Zeichenfolge verdoppelt werden muss, und fährt dann so oft fort. Da der zu kopierende Rest jetzt kleiner ist als die Gesamtlänge, von der kopiert wird, kann er einfach eine Teilmenge dessen kopieren, was er bereits generiert hat.
Ich habe die Array.Copy () -Methode anstelle der Verwendung von StringBuilder verwendet, da das Kopieren des Inhalts des StringBuilder in sich selbst den Aufwand hätte, bei jeder Iteration einen neuen String mit diesem Inhalt zu erstellen. Array.Copy () vermeidet dies und arbeitet dennoch mit einer extrem hohen Effizienz.
Diese Lösung benötigt O (1 + log N) -Iterationen, eine Rate, die logarithmisch mit der Anzahl der Wiederholungen zunimmt (die Verdoppelung der Anzahl der Wiederholungen entspricht einer zusätzlichen Iteration), was eine erhebliche Einsparung gegenüber den anderen Methoden darstellt, die proportional zunehmen.