Sélection d'une classe de collection
Veillez à choisir votre classe de collection avec beaucoup de soin. Le choix d'une collection erronée peut limiter l'usage que vous pouvez en faire. En général, évitez d'utiliser les types de l'espace de noms System.Collections à moins que vous ne cibliez spécifiquement le .NET Framework version 1.1. Les versions génériques et simultanées des collections doivent être préférées en raison de leur sécurité de type supérieure et d'autres améliorations.
Réfléchissez aux questions suivantes :
Avez-vous besoin d'une liste séquentielle dans laquelle l'élément est généralement abandonné une fois sa valeur récupérée ?
Si oui, utilisez la classe Queue ou la classe générique Queue<T> si vous avez besoin d'un comportement de premier entré premier sorti (FIFO). Utilisez la classe Stack ou la classe générique Stack<T> si vous avez besoin d'un comportement de dernier entré premier sorti (LIFO). Pour un accès sécurisé à partir de plusieurs threads, utilisez les versions simultanées ConcurrentQueue<T> et ConcurrentStack<T>.
Sinon, utilisez les autres collections.
Devez-vous accéder aux éléments dans un ordre précis, tel que FIFO, LIFO ou dans un ordre aléatoire ?
La classe Queue et la classe générique Queue<T> ou ConcurrentQueue<T> proposent un accès FIFO. Pour plus d'informations, consultez Quand utiliser une collection thread-safe.
La classe Stack et la classe générique Stack<T> ou ConcurrentStack<T> proposent un accès LIFO. Pour plus d'informations, consultez Quand utiliser une collection thread-safe.
La classe générique LinkedList<T> autorise un accès séquentiel à partir du début ou de la fin.
Avez-vous besoin d'accéder à chaque élément par son index ?
Les classes ArrayList et StringCollection et la classe générique List<T> offrent l'accès à leurs éléments par l'index de base zéro de l'élément.
Les classes Hashtable, SortedList, ListDictionary et StringDictionary, et les classes génériques Dictionary<TKey, TValue> et SortedDictionary<TKey, TValue>, offrent l'accès à leurs éléments par la clé de l'élément.
Les classes NameObjectCollectionBase et NameValueCollection, et les classes génériques KeyedCollection<TKey, TItem> et SortedList<TKey, TValue>, offrent l'accès à leurs éléments par l'index de base zéro ou par la clé de l'élément.
Chaque élément contiendra-t-il une seule valeur, une combinaison d'une clé et d'une valeur ou une combinaison d'une clé et de plusieurs valeurs ?
Une valeur : utilisez l'une des collections basée sur l'interface IList ou l'interface générique IList<T>.
Une clé et une valeur : utilisez l'une des collections basée sur l'interface IDictionary ou l'interface générique IDictionary<TKey, TValue>.
Une valeur avec clé incorporée : utilisez la classe générique KeyedCollection<TKey, TItem>.
Une clé et plusieurs valeurs : utilisez la classe NameValueCollection.
Avez-vous besoin de trier les éléments dans un ordre différent de celui dans lequel ils ont été entrés ?
La classe Hashtable trie ses éléments par leurs codes de hachage.
La classe SortedList et les classes génériques SortedDictionary<TKey, TValue> et SortedList<TKey, TValue> trient leurs éléments par la clé, selon les implémentations de l'interface IComparer et de l'interface générique IComparer<T>.
ArrayList fournit une méthode Sort qui prend une implémentation IComparer comme paramètre. Son équivalent générique, la classe générique List<T>, fournit une méthode Sort qui prend une implémentation de l'interface générique IComparer<T> comme paramètre.
Avez-vous besoin d'opérations de recherche et de récupération d'informations rapides ?
- ListDictionary est plus rapide que Hashtable pour les petites collections (10 éléments ou moins). La classe générique Dictionary<TKey, TValue> fournit une capacité de recherche plus rapide que la classe générique SortedDictionary<TKey, TValue>. L'implémentation multithread est ConcurrentDictionary<TKey, TValue>. ConcurrentBag<T> fournit une insertion multithread rapide pour les données non ordonnées. Pour plus d'informations sur les deux types multithread, consultez Quand utiliser une collection thread-safe.
Avez besoin de collections qui acceptent uniquement des chaînes ?
StringCollection (sur la base de IList) et StringDictionary (sur la base de IDictionary) figurent dans l'espace de noms System.Collections.Specialized.
En outre, vous pouvez utiliser l'une des classes de collections génériques dans l'espace de noms System.Collections.Generic comme collection de chaînes fortement typée en spécifiant la classe String de leurs arguments de type générique.
LINQ to Objects et PLINQ
LINQ to Objects permet aux développeurs d'utiliser des requêtes LINQ pour accéder aux objets en mémoire tant que le type d'objet implémente IEnumerable ou IEnumerable<T>. Les requêtes LINQ fournissent un modèle commun pour accéder aux données, sont généralement plus concises et lisibles que les boucles foreach standard et intègrent des fonctions de filtrage, de classement et de regroupement. Pour plus d'informations, consultez LINQ to Objects.
PLINQ fournit une implémentation parallèle à LINQ to Objects qui peut offrir une exécution des requêtes plus rapide dans de nombreux scénarios, via l'utilisation plus efficace des ordinateurs multicœurs. Pour plus d'informations, consultez Parallel LINQ (PLINQ).
Voir aussi
Référence
System.Collections.Specialized