Outils pour utilisateurs

Outils du site


lang:csharp:list

Ceci est une ancienne révision du document !


Extension des IEnumerable

De base, un IEnumerable ne peut être utilisé que pour une seule chose, le foreach.

Il est cependant possible de pouvoir le doter des mêmes capacités qu'une liste via LINQ, simplement en ajoutant l'import using System.Linq;.

Il est alors possible de compter le nombre d'éléments .Count(), d'accéder à un élément de la liste .ElementAt(int), etc…

Pour savoir si c'est vide : !enumerable.Any() signifie isEmpty().

Différents types

Type Unique Ajout Ajouter liste Lecture seule Trié Implémentation
Etat Si déjà existant
List<T> Non - Add AddRange AsReadOnly(). L'objet encapsule la liste, pas de doublon en mémoire. Source, Archive Non Tableau (Array) de capacité 0 au début. A la première insertion, la capacité passe à 4 puis double à chaque fois que nécessaire avec un minimum à la nouvelle taille demandée pour InsertRange. La taille maximale est 0X7FEFFFFF (Array.MaxArrayLength). Insert et Remove appellent Array.Copy. Remove ne déduit pas l'occupation mémoire mais Clear oui. Source, Archive
SortedList<T,U> Oui Add génère ArgumentException Add - - Oui Stockage en mémoire identique à List. Source, Archive
Queue<T> Non - Enqueue - - Oui Stockage en mémoire identique à List. Source, Archive
LinkedList<T> Non - Add* Add* (surcharge) Non Non Liste doublement chaînée. Source, Archive
HashSet<T> Oui Add renvoie false Add UnionWith qui est en fait une boucle sur Add Non Non Un HashSet possède :
* le nombre d'éléments,
* le nombre maxi d'éléments (au début 0 puis 3, 7, 11, … (Source, Archive), jusqu'à 7199369 automatiquement, au delà, calcul manuel et chute de la performance),
* un tableau de taille “Nombre d'éléments maxi” dont chaque élément pointe vers un début d'une liste chaînée. Chaque élément est stocké dans la liste à l'indice HashCode % TailleMaxiTableau,
* un tableau de taille “Nombre d'éléments maxi” qui stocke chaque élément unitaire d'une liste chaînée où next pointe vers l'indice dans le tableau (-1 pour fin de la liste).
Si on ajoute un élément qui est supérieur à la taille maxi, on passe au nombre premier suivant dans la liste, on modifie la taille des deux tableaux et on recalcule dans quelle liste chaînée doit être stockée chaque élément en fonction du nouveau HashCode % TailleMaxiTableau. Source, Archive
Dictionary<T,U> Oui Add génère ArgumentException Add Non Non Non Stockage en mémoire identique à HashSet sur la clé. Source, Archive
SortedSet<T> Oui Add renvoie false Add UnionWith Non Oui C'est un arbre Red-Black. Source, Archive
SortedDictionary<T,U> Oui Add génère ArgumentException Add Non Non Oui Utilise en interne SortedSet. Source, Archive

Convertir une liste en un string avec un délimiteur

string.Join(", ", new List<int> { 1, 2, 3, 4 });

Comparaison entre les listes

List : travaille avec un tableau en interne.

LinkedList : travaille avec des objets qui sont chaînés.

Déplacer une ligne dans une liste

Pas de méthode miracle :

Pour List

T item = liste[oldIndex];
liste.RemoveAt(oldIndex);
liste.Insert(oldIndex - 1, item);
lang/csharp/list.1500029164.txt.gz · Dernière modification : 2017/07/14 12:46 de root