Para uso geral, as soluções que envolvem a classe StringBuilder são melhores para repetir seqüências de vários caracteres. É otimizado para lidar com a combinação de um grande número de strings de uma maneira que a concatenação simples não pode e que seria difícil ou impossível fazer com mais eficiência manualmente. As soluções StringBuilder mostradas aqui usam iterações O (N) para concluir, uma taxa fixa proporcional ao número de vezes que é repetida.
No entanto, para um número muito grande de repetições ou onde altos níveis de eficiência devem ser extraídos, uma abordagem melhor é fazer algo semelhante à funcionalidade básica do StringBuilder, mas produzir cópias adicionais a partir do destino, e não da sequência original, como abaixo.
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);
}
Isso dobra o comprimento da cadeia de origem / destino a cada iteração, o que economiza a sobrecarga de redefinir os contadores toda vez que ela passa pela cadeia original, em vez de ler e copiar facilmente a cadeia agora muito mais longa, algo que os processadores modernos podem fazer mais eficientemente.
Ele usa um logaritmo de base 2 para descobrir quantas vezes ele precisa dobrar o comprimento da string e, em seguida, continua fazendo isso várias vezes. Como o restante a ser copiado agora é menor que o tamanho total do qual está copiando, ele pode simplesmente copiar um subconjunto do que já gerou.
Eu usei o método Array.Copy () sobre o uso de StringBuilder, pois uma cópia do conteúdo do StringBuilder em si teria a sobrecarga de produzir uma nova string com esse conteúdo a cada iteração. Array.Copy () evita isso, enquanto ainda opera com uma taxa extremamente alta de eficiência.
Essa solução leva para que as iterações O (1 + log N) sejam concluídas, uma taxa que aumenta logaritmicamente com o número de repetições (dobrar o número de repetições equivale a uma iteração adicional), uma economia substancial em relação aos outros métodos, que aumentam proporcionalmente.