T: / Corrigés des challenges / C#
Boucle, parsing et découverte de la classe StringBuilder
On poursuit les corrigés de l’édition 2025 de la Battle Dev Thales. Dans ce challenge, on disposait d’une liste d’équipements représentés sous la forme code:niveau. Il fallait alors comparer chaque niveau à une valeur de contrôle (control), ignorer ceux qui étaient en dessous ou égaux pour concaténer leur code, tout en calculant la somme des écarts.
3 étapes dans la résolution de ce challenge :
Voici un code possible :
using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
class Challenge
{
static void Main()
{
//== NE PAS TOUCHER - Exemple de jeu de données
int control = 43;
string[] equipements = {"ZL:97", "JD:50", "TQ:21", "OG:62", "RT:23", "WU:45", "XC:29", "UB:83", "UC:35", "QK:63", "PU:54", "MU:22", "QG:60", "YM:92", "KJ:57"};
//== NE PAS TOUCHER
int total = 0;
StringBuilder reponse = new StringBuilder();
foreach (string informations in equipements)
{
string[] parts = informations.Split(':');
string code = parts[0];
int level = int.Parse(parts[1]);
if (level <= control)
{
continue;
}
reponse.Append(code);
total += (level - control);
}
Console.WriteLine($"{reponse}_{total}");
}
}
Un peu d’explications :
A la place de StringBuilder, on aurait très bien pu faire :
//== Avant le foreach
string reponse = "";
//== Dans le foreach
reponse += code;
Il faut savoir qu’en C#, une chaine de caractère est immuable, c’est à dire qu’on ne peut pas la modifier directement. A chaque fois qu’on concatène avec +=, le langage crée une nouvelle chaine de caractères, copie l’ancienne, y ajoute la nouvelle partie, puis détruit l’ancienne. Sur une dizaine d’éléments, comme ici, ce n’est pas un souci. Mais sur plusieurs milliers, cette opération répétée devient couteuse en mémoire et donc en performance.
C’est là qu’intervient StringBuilder ! Cet objet est conçu pour construire une chaîne progressivement, sans recréer de nouvelles chaînes à chaque ajout.
StringBuilder est une classe de l’espace de noms System.Text. Elle permet de construire et modifier des chaînes sans créer de nouvelles instances à chaque modification. On peut y ajouter, insérer ou remplacer du texte efficacement grâce à des méthodes comme .Append(), .Insert() ou .Replace().
Dans ce corrigé, on a donc revu les bases de C# avec une boucle foreach, la méthode Split(), de la conversion de types, etc.
C’est aussi la bonne occasion de découvrir la classe StringBuilder, qui permet de gérer des chaînes de manière plus efficace quand les concaténations deviennent nombreuses.
2 liens pour aller + loin (en anglais) :
Other content to discover