Chaînes de caractères
Notions théoriques
Immutabilité des chaînes
En C#, les chaînes (string) sont immuables : chaque opération de modification crée une nouvelle chaîne en mémoire.
string s = "Bonjour";
s = s.ToUpper(); // crée une nouvelle chaîne "BONJOUR", s pointe vers elle
// L'ancienne chaîne "Bonjour" est abandonnée
Méthodes courantes de string
string texte = " Bonjour le Monde ";
// Nettoyage
Console.WriteLine(texte.Trim()); // "Bonjour le Monde"
Console.WriteLine(texte.TrimStart()); // "Bonjour le Monde "
Console.WriteLine(texte.TrimEnd()); // " Bonjour le Monde"
// Casse
Console.WriteLine(texte.ToUpper()); // " BONJOUR LE MONDE "
Console.WriteLine(texte.ToLower()); // " bonjour le monde "
// Longueur
Console.WriteLine(texte.Length); // 20 (espaces inclus)
// Recherche
Console.WriteLine(texte.Contains("Monde")); // true
Console.WriteLine(texte.StartsWith(" Bon")); // true
Console.WriteLine(texte.EndsWith("de ")); // true
Console.WriteLine(texte.IndexOf("le")); // 9
// Extraction
Console.WriteLine(texte.Trim().Substring(0, 7)); // "Bonjour"
// Remplacement
Console.WriteLine(texte.Replace("Monde", "C#")); // " Bonjour le C# "
// Découpage
string[] mots = "un,deux,trois".Split(','); // ["un", "deux", "trois"]
Interpolation avec formatage
double montant = 1234.567;
int nb = 42;
Console.WriteLine($"{montant:F2}"); // 1234,57
Console.WriteLine($"{montant:C}"); // 1 234,57 €
Console.WriteLine($"{nb:D5}"); // 00042
Console.WriteLine($"{0.175:P1}"); // 17,5 %
// Alignement
Console.WriteLine($"{"Nom",-20} {"Note",6}"); // colonne gauche 20, droite 6
Console.WriteLine($"{"Alice",-20} {15.5,6:F1}");
StringBuilder — efficacité pour les concatenations en boucle
En C#, concatener des chaînes dans une boucle avec + est inefficace (crée une nouvelle chaîne à chaque itération). StringBuilder résout ce problème :
using System.Text;
var sb = new StringBuilder();
sb.Append("Bonjour");
sb.Append(", ");
sb.AppendLine("Alice !"); // Append + retour à la ligne
sb.Insert(0, ">>> "); // insérer au début
sb.Replace("Alice", "Bob");
string resultat = sb.ToString();
Console.WriteLine(resultat);
Comparaison de chaînes
string a = "Bonjour";
string b = "bonjour";
// Sensible à la casse
Console.WriteLine(a == b); // false
Console.WriteLine(a.Equals(b)); // false
// Insensible à la casse
Console.WriteLine(a.Equals(b, StringComparison.OrdinalIgnoreCase)); // true
Console.WriteLine(string.Equals(a, b, StringComparison.OrdinalIgnoreCase)); // true
Chaînes verbatim et raw string literals
// Chaîne verbatim : @ permet les backslashes sans échappement
string chemin = @"C:\Utilisateurs\Alice\Documents";
// Raw string literal (C# 11) : pas d'échappement du tout
string json = """
{
"nom": "Alice",
"age": 20
}
""";
Exemple pratique
// Analyse d'un texte
string texte = "Le langage C# est puissant, flexible et moderne. C# est utilisé partout.";
// Découpage en mots
string[] mots = texte.Split(new char[] { ' ', ',', '.', '!' }, StringSplitOptions.RemoveEmptyEntries);
// Statistiques
Console.WriteLine($"Texte analysé : \"{texte}\"");
Console.WriteLine($"Nombre de caractères : {texte.Length}");
Console.WriteLine($"Nombre de mots : {mots.Length}");
// Trouver le mot le plus long
string plusLong = "";
foreach (string mot in mots)
if (mot.Length > plusLong.Length)
plusLong = mot;
Console.WriteLine($"Mot le plus long : '{plusLong}' ({plusLong.Length} lettres)");
// Compter les occurrences de "C#"
int nbCS = 0;
foreach (string mot in mots)
if (mot.Equals("C#", StringComparison.OrdinalIgnoreCase)) nbCS++;
Console.WriteLine($"Occurrences de C# : {nbCS}");
// Trier les mots et afficher
Array.Sort(mots);
Console.WriteLine($"Mots triés : {string.Join(", ", mots.Distinct())}");
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Vous allez analyser un texte et produire des statistiques.
Étape 1 — Découper le texte en mots
Utilisez Split pour découper un texte en mots.
Sans StringSplitOptions.RemoveEmptyEntries, deux séparateurs consécutifs (double espace, ponctuation collée) génèrent des chaînes vides dans le résultat. L'option RemoveEmptyEntries les supprime automatiquement.
Étape 2 — Trouver le mot le plus long
Parcourez le tableau et trouvez le mot le plus long.
Initialiser plusLong = "" (chaîne vide, longueur 0) garantit que le premier mot sera toujours retenu comme candidat, car n'importe quel mot est plus long qu'une chaîne vide.
Étape 3 — Afficher les mots triés en majuscules
Triez les mots et affichez-les en majuscules avec StringBuilder.
Construire une longue chaîne en boucle avec + crée une nouvelle chaîne à chaque itération (coût O(n²)). StringBuilder maintient un tampon interne et ne copie qu'à la fin avec .ToString() (coût O(n)). Pour 5 mots c'est négligeable ; pour des milliers, la différence est énorme.