Parsing et utilisation de StringBuilder en C#

Boucle, parsing et découverte de la classe StringBuilder

→ Challenge Correction: Bug-out Shelter #4 – Vital Silence

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.

Résolution du challenge

3 étapes dans la résolution de ce challenge :

  • Parsing et typage des données
  • Contrôle
  • Concaténation de la réponse et calcul du total

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 :

  • Avant la boucle, on crée un entier total qu’on initialise à 0 et un objet reponse qui est une instance de StringBuilder (on y reviendra dans la section suivante)
  • On parcourt le tableau equipements avec un foreach
  • On découpe chaque chaine de caractères avec la méthode split
  • On crée une chaine de caractère code qui contient la première partie parts[0]
  • On crée un entier level qui contient la seconde partie parts[1]. On passe d’une chaine de caractère à un entier avec int.Parse()
  • On teste la condition de controle. Ici on choisit de faire un continue si on est égal ou sous le niveau. On aurait pu inverser la condition et réaliser la logique suivante dans le if. Mais faire comme ça permet de réduire la complexité cyclomatique du code.
  • On concatène le code à retenir dans reponse avec la méthode Append de la classe StringBuilder
  • On incrémente le total avec le différentiel entre level et control

Utilisation de la classe StringBuilder

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().

Conclusion

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) :


Qui a codé ce superbe contenu ?

Keep learning

Other content to discover