Quand utiliser les collections génériques

L’utilisation de collections génériques vous offre l’avantage automatique de la sécurité de type sans avoir à dériver d’un type de collection de base et à implémenter des membres spécifiques au type. Les types de collections génériques sont généralement plus performants que leurs équivalents non génériques (et mieux que les types dérivés de types de collections de base non génériques) quand les éléments de collection sont des types valeur, car grâce aux génériques, aucun boxing d’éléments n'est nécessaire.

Pour les programmes qui ciblent le .NET Standard 1.0 ou version ultérieure, vous devez utiliser les classes de collections génériques dans l’espace de noms System.Collections.Concurrent quand plusieurs threads sont susceptibles d'ajouter ou de supprimer simultanément des éléments de la collection. En outre, lorsque l’immuabilité est souhaitée, tenez compte des classes de collection générique dans l’espace de noms System.Collections.Immutable.

Les types génériques suivants correspondent à des types de collections existants :

Autres types

Plusieurs types de collections génériques n'ont pas d'équivalents non génériques. Il s'agit des dossiers suivants :

  • LinkedList<T> est une liste liée à usage général qui fournit des opérations d'insertion et de suppression O(1).

  • SortedDictionary<TKey,TValue> est un dictionnaire trié avec des opérations d'insertion et d'extraction O(log n), ce qui en fait une alternative pratique à SortedList<TKey,TValue>.

  • KeyedCollection<TKey,TItem> est un hybride entre une liste et un dictionnaire qui permet de stocker des objets qui contiennent leurs propres clés.

  • BlockingCollection<T> implémente une classe de collection avec une fonctionnalité d'englobement et de blocage.

  • ConcurrentBag<T> permet une insertion et une suppression rapides des éléments non triés.

Constructeurs immuables

Lorsque vous souhaitez des fonctionnalités d’immuabilité dans votre application, l’espace de noms System.Collections.Immutable propose des types de collection génériques que vous pouvez utiliser. Tous les types de collections immuables offrent des classes Builder qui peuvent optimiser les performances lorsque vous effectuez plusieurs mutations. La classe Builder traite les opérations par lots dans un état mutable. Une fois toutes les mutations terminées, appelez la méthode ToImmutable pour « figer » tous les nœuds et créer une collection générique immuable, par exemple un ImmutableList<T>.

L’objet Builder peut être créé en appelant la méthode non générique CreateBuilder(). À partir d’une instance Builder, vous pouvez appeler ToImmutable(). De même, à partir de la collection Immutable*, vous pouvez appeler ToBuilder() pour créer une instance de générateur à partir de la collection immuable générique. Voici les différents types Builder.

LINQ to Objects

La fonctionnalité LINQ to Objects permet d'utiliser des requêtes LINQ pour accéder aux objets en mémoire tant que le type d'objet implémente l'interface System.Collections.IEnumerable ou System.Collections.Generic.IEnumerable<T> . Les requêtes LINQ fournissent un modèle commun pour accéder aux données. Elles sont généralement plus concises et plus lisibles que les boucles foreach standard et offrent des fonctions de filtrage, de classement et de regroupement. Les requêtes LINQ peuvent également améliorer les performances. Pour plus d’informations, consultez LINQ to Objects (C#), LINQ to Objects (Visual Basic) et Parallel LINQ (PLINQ).

Autres fonctionnalités

Certains types génériques ont des fonctionnalités que n'ont pas les types de collections non génériques. Par exemple, la classe List<T> , qui correspond à la classe non générique ArrayList , possède plusieurs méthodes acceptant des délégués génériques, telles que le délégué Predicate<T> qui permet de spécifier des méthodes pour effectuer des recherches dans la liste, le délégué Action<T> , qui représente des méthodes qui agissent sur chaque élément de la liste, et le délégué Converter<TInput,TOutput> qui permet de définir des conversions de types.

La classe List<T> permet de spécifier vos propres implémentations d'interface générique IComparer<T> pour trier et parcourir des listes. Les classes SortedDictionary<TKey,TValue> et SortedList<TKey,TValue> possèdent également cette fonctionnalité. De plus, ces classes permettent de spécifier des comparateurs au moment de la création de la collection. De la même façon, les classes Dictionary<TKey,TValue> et KeyedCollection<TKey,TItem> permettent de spécifier vos propres comparateurs d'égalité.

Voir aussi