Per uso generale, le soluzioni che coinvolgono la classe StringBuilder sono le migliori per ripetere stringhe multi-carattere. È ottimizzato per gestire la combinazione di un gran numero di stringhe in un modo che la semplice concatenazione non può e che sarebbe difficile o impossibile fare in modo più efficiente a mano. Le soluzioni StringBuilder mostrate qui utilizzano O (N) iterazioni per il completamento, un tasso fisso proporzionale al numero di volte che viene ripetuto.
Tuttavia, per un numero molto elevato di ripetizioni o in cui è necessario ottenere livelli elevati di efficienza, un approccio migliore è fare qualcosa di simile alla funzionalità di base di StringBuilder ma produrre copie aggiuntive dalla destinazione piuttosto che dalla stringa originale, come sotto.
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);
}
Questo raddoppia la lunghezza della stringa di origine / destinazione con ogni iterazione, il che evita il sovraccarico di reimpostare i contatori ogni volta che passa attraverso la stringa originale, invece di leggere e copiare senza problemi la stringa ora molto più lunga, qualcosa che i moderni processori possono fare molto Più efficiente.
Utilizza un logaritmo in base 2 per trovare quante volte è necessario raddoppiare la lunghezza della stringa e quindi procede a farlo più volte. Poiché il resto da copiare è ora inferiore alla lunghezza totale da cui sta copiando, può quindi semplicemente copiare un sottoinsieme di ciò che ha già generato.
Ho usato il metodo Array.Copy () sull'uso di StringBuilder, poiché una copia del contenuto di StringBuilder in se stesso avrebbe il sovraccarico di produrre una nuova stringa con quel contenuto con ogni iterazione. Array.Copy () evita questo, pur continuando a operare con un tasso di efficienza estremamente elevato.
Questa soluzione richiede il completamento delle iterazioni O (1 + log N) , una velocità che aumenta logaritmicamente con il numero di ripetizioni (raddoppiare il numero di ripetizioni equivale a un'iterazione aggiuntiva), un notevole risparmio rispetto agli altri metodi, che aumentano in modo proporzionale.