1. List<T>
Cette quête te familiarisera avec la manipulation des listes
Objectifs
- Savoir instancier une liste
- Savoir manipuler une liste
Le type List
Une liste est une collection de valeurs du même type en C#. Sa taille change en fonction du nombre d'éléments qu'elle contient.
On déclare une liste d'entiers comme suit :
System.Collections.Generic.List<int> integerCollection = new List<int>();
Regardons plus en détail la ligne tapée dans l'exemple plus haut :
-
On a une suite de mots séparés par des points
-
On a un type entre deux crochets <>
La suite de mots séparés par des points récupère le type List dans un espace de noms. Cette suite de mots séparés par des points stipule le chemin à emprunter pour retrouver le type List, qui n'est pas disponible dans l'espace de nom général. Ainsi, le chemin vers les collections génériques en C# est System.Collections.Generics.
List<T> est un type générique. Un générique est une variable typée lors de la compilation, c'est-à-dire un type qui peut changer son comportement en fonction d'un autre, qu'il accueille. Je sais que ça paraît flou pour le moment, mais un peu de patience ...
Le type présent entre les deux crochets spécifie le type de données que la liste contient. Il est impératif de le spécifier puisque C# est un langage statiquement typé et que toutes ses collections ne peuvent contenir qu'un seul et même type de données.
Comment j'ajoute et je supprime ?
Ajouter une valeur dans une liste
Comme une liste est de taille variable, lorsque l'on veut ajouter un élément, on ne peut pas utiliser d'indice puisque la zone mémoire correspondant à l'indice n'est pas encore allouée. Afin de pouvoir ajouter des éléments, C# met à disposition des méthodes qui permettent d'ajouter et d'enlever des éléments.
Si tu essayes d'accéder à un élément d'une liste dont la zone mémoire n'est pas allouée, tu soulèves une erreur fatale qui stoppe le programme pendant l'exécution :
System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Afin d'ajouter un élément, tu vas utiliser la méthode Add([ta valeur]).
Exemple:
List<float> floatCollection = new List<float>();
floatCollection.Add(1.23);
floatCollection.Add(345.1234);
floatCollection.Add(45.65);
Tout ce que tu as à faire est d’ajouter un point derrière l'identifiant de ta variable de type List<T>, de taper Add, puis de mettre la valeur que tu souhaites ajouter dans ta liste entre parenthèses, juste après Add. Voici comment on fait appel à une méthode en C#.
A chaque appel à Add, la taille de ta collection est incrémentée et un élément est ajouté à la fin. Tu peux donc y accéder avec un indice entre crochets, car la zone mémoire contenant une valeur a été créée et mise à la suite de la fin de ta liste.
Ainsi,
float decimalNumber = floatCollection[0];
Ne soulève plus d'erreur fatale après que l'indice a été ajouté. Tu peux même, une fois que tu as accès à l'indice, modifier ta valeur avec celui-ci :
List<float> floatCollection = new List<float>();
floatCollection.Add(1.23); // floatCollection[0] contains 1.23
floatCollection[0] = 0.0 // floatCollection[0] now contains 0.0
C'est bien beau d'ajouter des éléments, mais si je veux en supprimer, je m'y prends comment ?
Suppression d'un élément dans une liste
Comme les listes sont des collections, leur taille varie en fonction du nombre d'éléments présents à l'intérieur. Il existe donc une méthode qui permet de supprimer une donnée grâce à son indice.
Trêve de papotages, voici un code qui montre comment supprimer un élément dans une liste :
List<string> stringCollection = new List<string>();
charCollection.Add("remove me");
// Collection has one element "remove me" at index 0
charCollection.RemoveAt(0);
// Collection is now empty
Il existe une deuxième méthode permettant de supprimer un ou plusieurs éléments dans une liste. Celle que je t'ai montrée plus haut supprime un élément et un seul à un certain indice. Cette méthode est utile, mais imaginons une autre situation où tu veux supprimer une valeur dont tu ne connais pas l'indice dans une liste. Eh bien les développeurs .NET ont pensé à ce cas de figure et t'ont mis à disposition une méthode Remove qui supprime la première occurrence d'une valeur à partir du début de la liste :
List<char> charCollection = new List<char>();
charCollection.Add('h');
charCollection.Add('e');
charCollection.Add('l');
charCollection.Add('l');
charCollection.Add('o');
// charCollection equals to { 'h', 'e', 'l', 'l', 'o' }
charCollection.Remove('l');
// charCollection now equals to { 'h', 'e', 'l' 'o' }
Taille d'une liste
Souvent, on a besoin de connaître la taille d'une collection. C'est utile pour faire des traitements.
Eh bien il existe une propriété (et non une méthode) qui permet de récupérer la valeur actuelle de la longueur d'une liste. Il s'agit de Count:
List<bool> integerCollection = new List<bool>();
integerCollection.Add(true);
integerCollection.Add(false);
integerCollection.Add(true);
integerCollection.Add(true);
integerCollection.Add(false);
int actualCollectionCount = integerCollection.Count; // Equals to 5
integerCollection.RemoveAt(0);
integerCollection.Remove(true);
// integerCollection is now { false, true, false }
actualCollectionCount = integerCollection.Count; // Equals to 3
Challenge
Manipuler une liste
- Instancie une liste de chaînes de caractères
- Insères-y trois chaînes de caractères
- Supprime la première avec
RemoveAt([index]) - Supprime la troisième avec
Remove([valeur]) - Modifie la deuxième en utilisant son indice.
Critères de validation
- Un lien vers ta solution sur GitHub
- Trois chaînes de caractères sont insérées
- La première chaîne de caractères est supprimée avec
RemoveAt - La troisième chaîne de caractères est supprimée avec
Remove - La deuxième est modifiée