Pour une utilisation générale, les solutions impliquant la classe StringBuilder sont les meilleures pour répéter des chaînes à plusieurs caractères. Il est optimisé pour gérer la combinaison d'un grand nombre de chaînes d'une manière que la concaténation simple ne peut pas et qui serait difficile ou impossible à faire plus efficacement à la main. Les solutions StringBuilder présentées ici utilisent O (N) itérations pour terminer, un taux forfaitaire proportionnel au nombre de répétitions.
Cependant, pour un très grand nombre de répétitions, ou lorsque des niveaux élevés d'efficacité doivent être éliminés, une meilleure approche consiste à faire quelque chose de similaire aux fonctionnalités de base de StringBuilder mais à produire des copies supplémentaires à partir de la destination, plutôt qu'à partir de la chaîne d'origine, comme ci-dessous.
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);
}
Cela double la longueur de la chaîne source / destination à chaque itération, ce qui évite la réinitialisation des compteurs à chaque fois qu'elle parcourt la chaîne d'origine, au lieu de cela de lire et de copier en douceur la chaîne désormais beaucoup plus longue, ce que les processeurs modernes peuvent faire beaucoup. plus efficacement.
Il utilise un logarithme en base 2 pour trouver le nombre de fois qu'il a besoin de doubler la longueur de la chaîne, puis continue de le faire autant de fois. Étant donné que le reste à copier est désormais inférieur à la longueur totale à partir de laquelle il copie, il peut alors simplement copier un sous-ensemble de ce qu'il a déjà généré.
J'ai utilisé la méthode Array.Copy () sur l'utilisation de StringBuilder, car une copie du contenu de StringBuilder en lui-même aurait pour surcharge de produire une nouvelle chaîne avec ce contenu à chaque itération. Array.Copy () évite cela, tout en fonctionnant avec un taux d'efficacité extrêmement élevé.
Cette solution prend O (1 + log N) pour terminer, un taux qui augmente logarithmiquement avec le nombre de répétitions (doubler le nombre de répétitions équivaut à une itération supplémentaire), une économie substantielle par rapport aux autres méthodes, qui augmentent proportionnellement.