Para uso general, las soluciones que involucran la clase StringBuilder son las mejores para repetir cadenas de caracteres múltiples. Está optimizado para manejar la combinación de grandes cantidades de cadenas de una manera que la concatenación simple no puede y eso sería difícil o imposible de hacer de manera más eficiente a mano. Las soluciones de StringBuilder que se muestran aquí usan iteraciones O (N) para completar, una tarifa plana proporcional al número de veces que se repite.
Sin embargo, para un gran número de repeticiones, o donde se deben extraer altos niveles de eficiencia, un mejor enfoque es hacer algo similar a la funcionalidad básica de StringBuilder pero producir copias adicionales desde el destino, en lugar de desde la cadena original, como a continuación.
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);
}
Esto duplica la longitud de la cadena de origen / destino con cada iteración, lo que ahorra la sobrecarga de restablecer contadores cada vez que atraviesa la cadena original, en lugar de leer y copiar sin problemas la cadena ahora mucho más larga, algo que los procesadores modernos pueden hacer mucho más eficientemente
Utiliza un logaritmo de base 2 para encontrar cuántas veces necesita duplicar la longitud de la cadena y luego lo hace tantas veces. Dado que el resto a copiar ahora es menor que la longitud total desde la que está copiando, puede simplemente copiar un subconjunto de lo que ya ha generado.
He usado el método Array.Copy () sobre el uso de StringBuilder, ya que una copia del contenido del StringBuilder en sí mismo tendría la sobrecarga de producir una nueva cadena con ese contenido con cada iteración. Array.Copy () evita esto, mientras sigue funcionando con una tasa de eficiencia extremadamente alta.
Esta solución toma O (1 + log N) iteraciones para completar, una tasa que aumenta logarítmicamente con el número de repeticiones (duplicar el número de repeticiones es igual a una iteración adicional), un ahorro sustancial sobre los otros métodos, que aumentan proporcionalmente.
String
clase sobrecargado no está tomando una cadena como parámetro para crear repeticiones, lo que podría haber hecho que la respuesta aceptada encajara perfectamente.