Comment répéter correctement des caractères en C# : du code naïf à l'optimisation

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Pourquoi la question de la répétition de caractères est devenue culte

\n\n

Si vous avez déjà programmé en C#, vous avez sûrement été confronté à cette tâche : « J'ai besoin de créer une chaîne composée de N caractères identiques ». Cela semble simple, non ? Pourtant, cette question sur Stack Overflow a recueilli des milliers de vues et des dizaines de réponses. Pourquoi ? Parce que derrière cette apparente simplicité se cache tout un univers d'optimisation des performances et de pièges.

\n\n

Dans cet article, nous ne nous contenterons pas de montrer comment répéter un caractère en C#. Nous parcourrons le chemin allant de la solution naïve aux techniques professionnelles utilisées dans les systèmes à forte charge. Vous découvrirez quelle méthode convient le mieux pour répéter un caractère dans différents scénarios, et pourquoi certains conseils populaires sont en réalité nuisibles.

\n\n

À qui s'adresse cet article ?

\n
    \n
  • Aux développeurs C# débutants qui souhaitent écrire non seulement du code fonctionnel, mais aussi efficace
  • \n
  • Aux programmeurs expérimentés qui cherchent des moyens d'optimiser les opérations sur les chaînes
  • \n
  • À tous ceux qui se préparent à des entretiens techniques et souhaitent briller par leur connaissance du fonctionnement interne de .NET
  • \n
\n\n

Le problème : Pourquoi il ne faut pas écrire une boucle for

\n\n

Lorsqu'un débutant entend « répéter un caractère N fois », la première idée qui lui vient à l'esprit est une boucle for :

\n\n
string RepeatChar(char c, int count)\n{\n    string result = "";\n    for (int i = 0; i < count; i++)\n        result += c;\n    return result;\n}\n
\n\n

Cette solution fonctionne, mais elle est catastrophiquement lente. Pourquoi ? Parce que les chaînes en C# sont immuables. Chaque opération += crée une nouvelle chaîne, en y copiant l'ancien contenu plus un caractère. En conséquence, la complexité de cet algorithme est O(n²). Pour 10 caractères, c'est imperceptible, mais pour 100 000, c'est une éternité.

\n\n

Regardons les chiffres réels. Testons cette méthode avec count = 100 000. Sur un processeur moderne, cela prendra… plusieurs secondes. Et s'il faut répéter le caractère un million de fois ? Le programme « plantera » tout simplement.

\n\n

Conclusion : la boucle avec concaténation est un fléau. Mais il existe d'autres approches, plus efficaces.

\n\n

Les principales méthodes pour répéter un caractère en C#

\n\n

Examinons toutes les méthodes populaires discutées sur Stack Overflow et dans les projets réels. Nous testerons les performances de chacune et verrons quand les utiliser.

\n\n

1. StringBuilder classique

\n\n

La première étape vers l'optimisation est l'utilisation de StringBuilder. Il ne crée pas une nouvelle chaîne à chaque ajout, mais travaille avec un tampon :

\n\n
string RepeatWithStringBuilder(char c, int count)\n{\n    StringBuilder sb = new StringBuilder(count);\n    for (int i = 0; i < count; i++)\n        sb.Append(c);\n    return sb.ToString();\n}\n
\n\n

Notez que nous avons immédiatement défini une capacité initiale de count. C'est important ! Si vous ne spécifiez pas la capacité, StringBuilder devra réallouer la mémoire plusieurs fois, ce qui réduira les performances.

\n\n

Performances : O(n). Pour 100 000 caractères, cette méthode s'exécute en ~1-2 ms.

\n\n

2. Tableau de caractères + new string

\n\n

Voici l'une des méthodes les plus rapides dans .NET. Créez un tableau de la longueur souhaitée, remplissez-le avec le caractère et passez-le au constructeur de la chaîne :

\n\n
string RepeatWithArray(char c, int count)\n{\n    char[] chars = new char[count];\n    Array.Fill(chars, c);\n    return new string(chars);\n}\n
\n\n

Pourquoi est-ce rapide ? Parce que nous travaillons directement avec la mémoire : le tableau est rempli en une seule passe, et le constructeur new string(char[]) copie simplement les données dans le tampon interne de la chaîne. Aucune opération superflue.

\n\n

Performances :

Blogs

Book Recommendations