0Pricing
C# Academy · Leçon

Choisir une collection

Compromis et performances.

Choisir une collection est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.

Une première question

Le choix d'une collection commence par une question : comment accéderez-vous aux données ? Par position, par clé ou simplement pour vérifier l'appartenance ?

List, Dictionary et HashSet répondent chacun à un mode d'accès différent. Adaptez l'outil au mode d'accès pour que votre code reste rapide et clair.

Accès par position : liste

Si l'ordre compte et que vous accédez aux éléments par index, choisissez List<T>. Elle conserve l'ordre d'insertion et fournit un accès par index en O(1).

Exemples : une file d'étapes, des lignes dans l'ordre d'affichage ou toute séquence parcourue du début à la fin. Les doublons sont autorisés.

var steps = new List<string> { "mix", "bake", "cool" };
string first = steps[0]; // O(1) by index

Accès par clé : dictionnaire

Si vous recherchez des éléments à l'aide d'un identifiant unique, choisissez Dictionary<K,V>. Il associe une clé à une valeur en O(1) en moyenne.

Exemples : un identifiant utilisateur associé à un utilisateur, un code de pays associé à un nom, ou un mot associé à son nombre d'occurrences. La clé répond à « lequel ? », la valeur contient les données.

var users = new Dictionary<int, string> {
    [101] = "Ann",
    [102] = "Bob"
};
string name = users[101];

Appartenance et unicité : HashSet

Si seule la présence d'une valeur vous importe ou si vous devez refuser les doublons, choisissez HashSet<T>. Contains s'effectue en O(1) en moyenne.

Exemples : des URL visitées, des autorisations autorisées ou des balises distinctes. Aucune valeur n'y est associée : seule compte la présence de l'élément.

var visited = new HashSet<string>();
if (visited.Add(url)) {
    // first time seeing this url
}

Tableau des coûts

Coûts moyens : l'indexation de List s'effectue en O(1), mais Contains en O(n). Les recherches dans Dictionary et HashSet s'effectuent en O(1).

List.Add à la fin est en O(1) amorti ; l'insertion ou la suppression au milieu est en O(n). L'ajout et la suppression dans Dictionary et HashSet s'effectuent en O(1) en moyenne.

// List:       index O(1),  Contains O(n)
// Dictionary: by-key O(1), no index
// HashSet:    Contains O(1), no value, no index

Contains sur une liste est un signal d'alerte

Appeler à répétition list.Contains dans une boucle est un piège en O(n²). Chaque vérification parcourt toute la liste.

Si les vérifications d'appartenance dominent, passez à un HashSet. Ce simple changement peut transformer une boucle lente en boucle instantanée sur de grandes quantités de données.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var allow = new HashSet<int> { 2, 4, 6 };
        foreach (int n in new[] { 1, 2, 3, 4 })
            if (allow.Contains(n)) Console.Write(n + " ");
    }
}

Quand vous avez besoin à la fois d'une clé et d'un ordre

Vous avez besoin d'une recherche par clé, mais aussi d'un ordre prévisible ? Le Dictionary standard ne garantit pas l'ordre.

Envisagez de conserver une List pour l'ordre et un Dictionary pour les recherches, ou utilisez SortedDictionary<K,V> pour conserver les clés dans l'ordre trié, au coût de O(log n).

var sorted = new SortedDictionary<string, int>();
sorted["b"] = 2;
sorted["a"] = 1;
// enumerates a then b, in key order

Compromis mémoire

Les collections fondées sur le hachage échangent de la mémoire contre de la vitesse. Dictionary et HashSet conservent des compartiments internes et utilisent plus de mémoire qu'une List compacte ou qu'un tableau.

Pour les petites collections de quelques éléments, parcourir une List peut en réalité convenir et utiliser moins de mémoire. Le hachage devient rentable à grande échelle.

Programmer avec des interfaces

Les signatures de méthodes doivent demander le type le moins spécifique qui fonctionne. Acceptez IEnumerable<T> pour lire, IReadOnlyList<T> pour les lectures par index et IDictionary<K,V> pour l'accès par clé.

Cela découple les appelants de votre choix concret, ce qui vous permet de remplacer les implémentations plus tard sans modifier les signatures.

int Sum(IEnumerable<int> values) {
    int total = 0;
    foreach (int v in values) total += v;
    return total;
}

Exemple détaillé

Compter les mots uniques d'un texte nécessite deux collections utilisées ensemble. Un HashSet suit les mots déjà vus ; un Dictionary comptabilise les occurrences.

Chacun remplit bien son rôle : l'ensemble garantit l'unicité, le dictionnaire associe chaque mot à sa fréquence, les deux opérations s'effectuant en O(1) en moyenne.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var counts = new Dictionary<string, int>();
        foreach (var w in "a b a c b a".Split(' '))
            counts[w] = counts.GetValueOrDefault(w) + 1;
        Console.WriteLine(counts["a"]); // 3
    }
}

Liste de contrôle pour décider

Posez-vous les questions dans cet ordre : ai-je besoin d'une table associant clés et valeurs ? Utilisez Dictionary. Ai-je uniquement besoin d'unicité ou d'appartenance ? Utilisez HashSet.

Sinon, ai-je besoin d'un ordre et d'un accès par index, éventuellement avec des doublons ? Utilisez List. Cette courte liste couvre la plupart des cas courants.

Vérification rapide

Appliquez la liste de contrôle pour décider à un besoin concret.

Récapitulatif

Choisissez selon le mode d'accès : List pour les séquences ordonnées et indexées ; Dictionary pour les recherches clé-valeur ; HashSet pour l'unicité et l'appartenance.

Surveillez la complexité en notation grand O : évitez List.Contains dans les boucles très sollicitées, privilégiez les recherches par hachage en O(1) et programmez avec des interfaces afin de conserver un choix flexible.

Questions Fréquemment Posées

La leçon « Choisir une collection » est-elle gratuite ?

Oui — le texte complet de « Choisir une collection » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Choisir une collection » ?

Compromis et performances. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C# Academy ?

Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Choisir une collection » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?

Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Les listes en pratique
  2. Recherches dans les dictionnaires
  3. HashSet et unicité
  4. Choisir une collection
← Retour à C# Academy