Collections et structures de donnéesCollections and Data Structures

Des données similaires peuvent souvent être gérées plus efficacement quand elles sont stockées et manipulées en tant que collection.Similar data can often be handled more efficiently when stored and manipulated as a collection. Vous pouvez utiliser la classe System.Array, ou les classes qui se trouvent dans les espaces de noms System.Collections, System.Collections.Generic, System.Collections.Concurrent et System.Collections.Immutable, pour ajouter, supprimer et modifier des éléments individuels ou une série d’éléments dans une collection.You can use the System.Array class or the classes in the System.Collections, System.Collections.Generic, System.Collections.Concurrent, System.Collections.Immutable namespaces to add, remove, and modify either individual elements or a range of elements in a collection.

Il existe deux principaux types de collections : les collections génériques et non génériques.There are two main types of collections; generic collections and non-generic collections. Les collections génériques ont été ajoutées au .NET Framework 2.0 et fournissent des collections de type sécurisé au moment de la compilation.Generic collections were added in the .NET Framework 2.0 and provide collections that are type-safe at compile time. Pour cette raison, les collections génériques offrent généralement de meilleures performances.Because of this, generic collections typically offer better performance. Les collections génériques acceptent un paramètre de type lorsqu'elles sont construites, et ne nécessitent pas de transtypage du type Object quand vous ajoutez ou supprimez des éléments de la collection.Generic collections accept a type parameter when they are constructed and do not require that you cast to and from the Object type when you add or remove items from the collection. De plus, la plupart des collections génériques sont prises en charge par les applications du Windows StoreWindows Store.In addition, most generic collections are supported in Windows StoreWindows Store apps. Les collections non génériques stockent les éléments en tant que Object, nécessitent un transtypage, et la plupart ne sont pas prises en charge pour le développement d'applications Windows StoreWindows Store.Non-generic collections store items as Object, require casting, and most are not supported for Windows StoreWindows Store app development. Cependant, vous pouvez rencontrer ces collections non génériques dans du code plus ancien.However, you may see non-generic collections in older code.

Depuis .NET Framework 4.NET Framework 4, les collections figurant dans l'espace de noms System.Collections.Concurrent fournissent des opérations thread-safe efficaces pour accéder aux éléments de collection à partir de plusieurs threads.Starting with the .NET Framework 4.NET Framework 4, the collections in the System.Collections.Concurrent namespace provide efficient thread-safe operations for accessing collection items from multiple threads. Les classes de collection immuable de l’espace de noms System.Collections.Immutable (NuGet package) sont thread-safe, car les opérations sont effectuées sur une copie de la collection d’origine et celle-ci ne peut donc pas être modifiée.The immutable collection classes in the System.Collections.Immutable namespace (NuGet package) are inherently thread-safe because operations are performed on a copy of the original collection and the original collection cannot be modified.

Fonctionnalités communes à toutes les collectionsCommon collection features

Toutes les collections fournissent des méthodes pour l'ajout, la suppression ou la recherche d'éléments au sein d'une collection.All collections provide methods for adding, removing or finding items in the collection. De plus, toutes les collections qui implémentent directement ou indirectement l'interface ICollection ou ICollection<T> partagent les fonctionnalités suivantes :In addition, all collections that directly or indirectly implement the ICollection interface or the ICollection<T> interface share these features:

  • Possibilité d'énumérer la collectionThe ability to enumerate the collection

    Les collections du .NET Framework implémentent soit System.Collections.IEnumerable, soit System.Collections.Generic.IEnumerable<T> pour permettre à la collection d'être parcourue..NET Framework collections either implement System.Collections.IEnumerable or System.Collections.Generic.IEnumerable<T> to enable the collection to be iterated through. Un énumérateur peut être vu comme un pointeur mobile pointant vers n'importe quel élément d'une collection.An enumerator can be thought of as a movable pointer to any element in the collection. L’instruction foreach, in et For Each...Next Instruction utilisent l’énumérateur exposé par la méthode GetEnumerator et masquent la complexité de la manipulation de l’énumérateur.The foreach, in statement and the For Each...Next Statement use the enumerator exposed by the GetEnumerator method and hide the complexity of manipulating the enumerator. En outre, toute collection qui implémente System.Collections.Generic.IEnumerable<T> est considérée comme étant un type requêtable et peut être interrogée avec LINQ.In addition, any collection that implements System.Collections.Generic.IEnumerable<T> is considered a queryable type and can be queried with LINQ. Les requêtes LINQ fournissent un modèle commun d'accès aux données.LINQ queries provide a common pattern for accessing data. Elles sont généralement plus concises et lisibles que les boucles foreach standard, et fournissent des fonctionnalités de filtrage, de tri et de regroupement.They are typically more concise and readable than standard foreach loops, and provide filtering, ordering and grouping capabilities. Les requêtes LINQ peuvent également améliorer les performances.LINQ queries can also improve performance. Pour plus d’informations, consultez LINQ to Objects, Parallel LINQ (PLINQ) et Introduction aux requêtes LINQ (C#).For more information, see LINQ to Objects, Parallel LINQ (PLINQ) and Introduction to LINQ Queries (C#).

  • La possibilité de copier le contenu d'une collection dans un tableauThe ability to copy the collection contents to an array

    Toutes les collections peuvent être copiées dans un tableau à l'aide de la méthode CopyTo. Toutefois, l'ordre des éléments du nouveau tableau sera basé sur l'ordre où ils sont retournés par l'énumérateur.All collections can be copied to an array using the CopyTo method; however, the order of the elements in the new array is based on the sequence in which the enumerator returns them. Le tableau résultant est toujours unidimensionnel avec une limite inférieure de zéro.The resulting array is always one-dimensional with a lower bound of zero.

De plus, de nombreuses classes de collection comprennent les fonctionnalités suivantes :In addition, many collection classes contain the following features:

  • Propriétés Capacity et CountCapacity and Count properties

    La propriété Capacity d'une collection indique le nombre d'éléments qu'elle peut contenir.The capacity of a collection is the number of elements it can contain. La propriété Count d'une collection indique le nombre d'éléments qu'elle contient réellement.The count of a collection is the number of elements it actually contains. Certaines collections masquent l'une de ces propriétés, voire les deux.Some collections hide the capacity or the count or both.

    La capacité de la plupart des collections s'étend automatiquement quand la valeur de la propriété Capacity est atteinte.Most collections automatically expand in capacity when the current capacity is reached. La mémoire est réallouée et les éléments sont copiés depuis l'ancienne collection vers la nouvelle.The memory is reallocated, and the elements are copied from the old collection to the new one. Cela permet de réduire le code nécessaire à l'utilisation de la collection. Toutefois, les performances de la collection peuvent être affectées.This reduces the code required to use the collection; however, the performance of the collection might be negatively affected. Par exemple, pour List<T>, si Count est inférieur à Capacity, l'ajout d'un élément correspond à une opération O(1).For example, for List<T>, If Count is less than Capacity, adding an item is an O(1) operation. Si la capacité doit être augmentée pour intégrer un nouvel élément, l'ajout d'un élément devient une opération O(n), où n est Count.If the capacity needs to be increased to accommodate the new element, adding an item becomes an O(n) operation, where n is Count. Le meilleur moyen d'éviter la dégradation des performances en raison des réallocations est de définir la propriété Capacity sur la taille estimée de la collection.The best way to avoid poor performance caused by multiple reallocations is to set the initial capacity to be the estimated size of the collection.

    BitArray est un cas particulier. Sa capacité est égale à sa longueur, qui est elle-même égale à son nombre.A BitArray is a special case; its capacity is the same as its length, which is the same as its count.

  • Une limite inférieure cohérenteA consistent lower bound

    La limite inférieure d'une collection est l'index de son premier élément.The lower bound of a collection is the index of its first element. Toutes les collections indexées dans l'espace de noms System.Collections ont une limite inférieure de zéro, ce qui signifie qu'elles sont indexées à 0.All indexed collections in the System.Collections namespaces have a lower bound of zero, meaning they are 0-indexed. Par défaut, Array a une limite inférieure de zéro. Vous pouvez cependant définir une autre limite inférieure quand vous créez une instance de la classe Array avec Array.CreateInstance.Array has a lower bound of zero by default, but a different lower bound can be defined when creating an instance of the Array class using Array.CreateInstance.

  • Synchronisation pour un accès depuis plusieurs threads (classes System.Collections uniquement).Synchronization for access from multiple threads (System.Collections classes only).

    Les types de collections non génériques de l'espace de noms System.Collections fournissent une certaine cohérence de thread pour la synchronisation, généralement exposée par des membres SyncRoot et IsSynchronized.Non-generic collection types in the System.Collections namespace provide some thread safety with synchronization; typically exposed through the SyncRoot and IsSynchronized members. Ces collections ne sont pas thread-safe par défaut.These collections are not thread-safe by default. Si vous avez besoin d'un accès multithread évolutif et efficace pour une collection, utilisez l'une des classes de l'espace de noms System.Collections.Concurrent ou envisagez d'utiliser une collection immuable.If you require scalable and efficient multi-threaded access to a collection, use one of the classes in the System.Collections.Concurrent namespace or consider using an immutable collection. Pour plus d’informations, consultez Collections thread-safe.For more information, see Thread-Safe Collections.

Choix d'une collectionChoosing a collection

En règle générale, vous devez utiliser des collections génériques.In general, you should use generic collections. Le tableau suivant décrit certains scénarios courants concernant les collections, ainsi que les classes de collection que vous pouvez utiliser pour ces scénarios.The following table describes some common collection scenarios and the collection classes you can use for those scenarios. Si vous ne connaissez pas encore les collections génériques, ce tableau vous aidera à choisir la collection générique qui répond le mieux à vos besoins.If you are new to generic collections, this table will help you choose the generic collection that works the best for your task.

Je souhaite :I want to… Options de collection génériqueGeneric collection options Options de collection non génériqueNon-generic collection options Options de collection thread-safe ou immuableThread-safe or immutable collection options
Stocker les éléments sous forme de paires clé/valeur pour une recherche rapide par cléStore items as key/value pairs for quick look-up by key Dictionary<TKey,TValue> Hashtable

(Collection de paires clé/valeur organisées en fonction du code de hachage de la clé).(A collection of key/value pairs that are organized based on the hash code of the key.)
ConcurrentDictionary<TKey,TValue>

ReadOnlyDictionary<TKey,TValue>

ImmutableDictionary<TKey,TValue>
Accéder aux éléments par indexAccess items by index List<T> Array

ArrayList
ImmutableList<T>

ImmutableArray
Utiliser des éléments premier entré, premier sorti (FIFO)Use items first-in-first-out (FIFO) Queue<T> Queue ConcurrentQueue<T>

ImmutableQueue<T>
Utiliser des données dernier entré, premier sorti (LIFO)Use data Last-In-First-Out (LIFO) Stack<T> Stack ConcurrentStack<T>

ImmutableStack<T>
Accéder aux éléments de manière séquentielleAccess items sequentially LinkedList<T> Aucune recommandationNo recommendation Aucune recommandationNo recommendation
Recevoir des notifications quand des éléments sont supprimés ou ajoutés à la collection.Receive notifications when items are removed or added to the collection. (implémente INotifyPropertyChanged et INotifyCollectionChanged)(implements INotifyPropertyChanged and INotifyCollectionChanged) ObservableCollection<T> Aucune recommandationNo recommendation Aucune recommandationNo recommendation
Collection triéeA sorted collection SortedList<TKey,TValue> SortedList ImmutableSortedDictionary<TKey,TValue>

ImmutableSortedSet<T>
Ensemble de fonctions mathématiquesA set for mathematical functions HashSet<T>

SortedSet<T>
Aucune recommandationNo recommendation ImmutableHashSet<T>

ImmutableSortedSet<T>

TitreTitle DescriptionDescription
Sélection d’une classe de collectionSelecting a Collection Class Décrit les différentes collections et permet d'en sélectionner une pour votre scénario.Describes the different collections and helps you select one for your scenario.
Types de collections couramment utilisésCommonly Used Collection Types Décrit les types de collection génériques et non génériques fréquemment utilisés, tels que System.Array, System.Collections.Generic.List<T> et System.Collections.Generic.Dictionary<TKey,TValue>.Describes commonly used generic and nongeneric collection types such as System.Array, System.Collections.Generic.List<T>, and System.Collections.Generic.Dictionary<TKey,TValue>.
Quand utiliser les collections génériquesWhen to Use Generic Collections Traite de l'utilisation des types de collections génériques.Discusses the use of generic collection types.
Comparaisons et tris dans les collectionsComparisons and Sorts Within Collections Aborde l'utilisation des comparaisons d'égalité et de tri dans les collections.Discusses the use of equality comparisons and sorting comparisons in collections.
Types de collections triéesSorted Collection Types Aborde les caractéristiques et les performances des collections triées.Describes sorted collections performance and characteristics
Types de collections Hashtable et DictionaryHashtable and Dictionary Collection Types Décrit les fonctionnalités des types de dictionnaires basés sur le hachage génériques et non génériques.Describes the features of generic and non-generic hash-based dictionary types.
Collections thread-safeThread-Safe Collections Décrit les types de collections tels que System.Collections.Concurrent.BlockingCollection<T> et System.Collections.Concurrent.ConcurrentBag<T> qui prennent en charge l'accès simultané sécurisé et efficace de plusieurs threads.Describes collection types such as System.Collections.Concurrent.BlockingCollection<T> and System.Collections.Concurrent.ConcurrentBag<T> that support safe and efficient concurrent access from multiple threads.
System.Collections.ImmutableSystem.Collections.Immutable Présente les collections immuables et fournit des liens vers les types de collection.Introduces the immutable collections and provides links to the collection types.

RéférenceReference

System.Array
System.Collections
System.Collections.Concurrent
System.Collections.Generic
System.Collections.Specialized
System.Linq
System.Collections.Immutable