Collections C# : guide des interfaces et implémentations

Panorama des collections en C# : interfaces, implémentations et cas d'usage pour choisir la bonne structure de données.

Sommaire
IEnumerable<T>

Contrat minimal d'itération en lecture. Idéal pour exposer un flux d'éléments et l'exécution différée (LINQ).

Avantages
  • Faible empreinte mémoire
  • Simple et universel
  • Supporte l'exécution différée
Inconvénients
  • Pas de Count ni d'index
  • Pas d'accès aléatoire
  • Souvent single-pass sauf matérialisation
ICollection<T>

Étend IEnumerable avec Count, Add, Remove, Contains, Clear. Usage : collections modifiables exposées ou internes.

Avantages
  • API d'écriture standard (Add/Remove)
  • Accès au Count
Inconvénients
  • Pas d'indexation garantie
  • Performances dépendant de l'implémentation
IReadOnlyCollection<T>

Expose le nombre d'éléments (Count) sans autoriser la modification. Usage : sorties d'API.

Avantages
  • Communique clairement l'intention de lecture seule
  • Facile à exposer depuis des collections existantes
Inconvénients
  • Ne protège pas l'instance sous-jacente d'éventuelles mutations
  • Limité aux opérations de lecture
IList<T>

Collection indexée (this[int index]). Usage : accès aléatoire et opérations par index.

Avantages
  • Accès O(1) par index sur List<T>
  • Insertion/suppression par position
Inconvénients
  • Exposition de la mutabilité
  • Certaines implémentations n'ont pas d'accès O(1)
IReadOnlyList<T>

Liste en lecture seule avec accès indexé. Usage : exposer une liste ordonnée sans modification.

Avantages
  • Accès indexé garanti en lecture
  • Intention claire pour les API
Inconvénients
  • La collection sous-jacente peut rester modifiable
  • Pas d'opérations d'écriture
ISet<T>

Ensemble d'éléments uniques. Usage : déduplication et vérification d'appartenance.

Avantages
  • Lookup rapide
  • Garantit l'unicité des éléments
Inconvénients
  • Ordre non garanti
  • Dépend du comparer/égalité pour le comportement
Résumé
  • IEnumerable<T> : lecture seule, itération simple
  • IReadOnlyCollection<T> : lecture seule + Count
  • IReadOnlyList<T> : lecture seule + index
  • ICollection<T> : lecture/écriture + opérations
  • IList<T> : indexé, ordre important
  • ISet<T> : unicité, opérations ensemblistes
Astuces
  • Exposez le type le plus restrictif possible
  • Privilégiez IReadOnly* en sortie
  • Acceptez IEnumerable en entrée si suffisant
  • N'exposez pas List<T> brute dans une API publique
Écrit le 2025-08-11