lang:csharp:list
Ceci est une ancienne révision du document !
Table des matières
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 | Ajoute | Existe | Chercher | Taille | Supprime | Trié | Lecture seule | Implémentation |
---|---|---|---|---|---|---|---|---|---|
List<T> | Non | Add : à la fin $O(1)$, Insert : à la position X $O(n)$ | Contains , *IndexOf : $O(n)$ | Find* : $O(n)$ FindAll $O(n)$ | Count : $O(1)$ | Remove* : $O(n)$ | Non | AsReadOnly() : l'objet encapsule la liste. Source, Archive | 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 et Clear ne déduisent pas l'occupation mémoire. Source, Archive |
SortedList<T,U> | Oui, Add génère ArgumentException | Add : $O(log(n))$ pour la position puis $O(n)$ pour l'insertion | ContainsKey , IndexOfKey , TryGetValue : $O(log(n))$ ContainsValue , IndexOfValue : $O(n)$ | LINQ | Count : $O(1)$ | Remove* : $O(n)$ | Oui | Keys , Values : l'objet encapsule la liste. | Stockage en mémoire identique à List . Source, Archive |
Queue<T> | Non | Enqueue | - | Buffer tournant de type FIFO . | Oui | Stockage en mémoire identique à List . Source, Archive | |||
Stack<T> | Non | Push | - | Accès uniquement à la dernière valeur ajoutée (Peek : sans enlever ou Pop en enlevant de la pile). | Oui | Stockage en mémoire identique à List . Source, Archive | |||
LinkedList<T> | Non | Add* | Add* (surcharge) | - | 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 | 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 | Stockage en mémoire identique à HashSet sur la clé. Source, Archive | |||
SortedSet<T> | Oui, Add renvoie false | Add | UnionWith | - | Oui | C'est un arbre Red-Black. Source, Archive | |||
SortedDictionary<T,U> | Oui, Add génère ArgumentException | Add | Non | - | Oui | Utilise en interne SortedSet . Source, Archive |
Note : $O(n)$ peut signifier deux choses : soit qu'il faut lire / écrire entre 1 et toutes les valeurs, soit qu'il faut obligatoirement lire toutes les valeurs. $O(log(n))$ correspond par exemple à une recherche dichotomique.
Convertir une liste en un string avec un délimiteur
string.Join(", ", new List<int> { 1, 2, 3, 4 });
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.1500056263.txt.gz · Dernière modification : 2017/07/14 20:17 de root