2. Dictionnaires
Après cette quête, tu sauras utiliser des dictionnaires
Objectifs
- Savoir instancier un dictionnaire
- Savoir manipuler un dictionnaire
Le dictionnaire perdu
Notre dictionnaire a été égaré !
Lors d'un voyage au bord de l'océan, je l'ai négligemment fait tomber dans l'eau. Je suis allé le chercher, mais son contenu était illisible, trop endommagé pour être lu.
Quel dommage ! Il s'agissait du dernier dictionnaire disponible sur Terre ... Je me sens terriblement coupable et j'aimerais me rattraper.
Pour pallier cette problématique, j'ai pensé t'apprendre les bases qui te permettront d'en créer un nouveau, plus riche, plus complet et que je n'égarerai plus dans l'eau ! Je ne me sens plus capable de garder autant de secrets, alors je te passe le flambeau.
Le type Dictionary<T key, T value>
Un dictionnaire contient des mots. Chaque mot renferme une ou plusieurs significations. Une ou plusieurs significations sont reliées à un ou plusieurs mots. Il faut donc que tu aies la capacité d'associer un élément à plusieurs éléments. Ah, et n'oublie pas qu'un dictionnaire évolue avec le temps, autant en termes du volume de mots que de significations. Tu dois donc préparer un espace évolutif, non figé en taille.
Pour ce faire, je vais te parler des collections, qui sont un moyen de ranger les mots et de leur associer des significations. Une collection est un ensemble de valeurs dont la taille varie en fonction du nombre d'éléments qu'elle contient. Peu importe l'indice ou le type de données qu'une collection contient.
Le type List<T> met à disposition des données indexées par valeur entière. Chaque donnée dans un List<T> est indexée par un entier. C'est donc une collection qui indexe ses éléments avec des entiers. List<T> n'est qu'un type de collection. Il y en a une foultitude d'autres et il n'y a que ta créativité et ce que les autres ont fait avant toi qui vont te permettre d'en créer de nouveaux.
Je peux donc créer des collections personnalisées ? Avec un type d'indice au choix ?
Eh bien, oui ! Si tu le désires, tu peux créer la collection de tes rêves. Et la réalisation de tes rêves les plus fous commence par la connaissance du type Dictionary<T, T>.
Dictionary<T, T> est un type de collection qui te permet de choisir le type d'indice qui va te permettre de récupérer une valeur stockée quelque part dans le dictionnaire.
Tu dois spécifier deux types lors de la déclaration d'un Dictionary<T, T>. Le premier est le type de ton indice, le second le type de la valeur contenue à chacun des indices:
Ainsi, si tu veux indexer des entiers par des chaînes de caractères
Dictionary<string, int> dictionary = new Dictionary<string, int>();
Comment je fais pour modifier les valeurs de mon dictionnaire ?
Lire les six premiers paragraphes. Laisser de côté le premier diagramme.
Modifier des valeurs
Contrairement à une liste, un dictionnaire n'a ni début, ni fin. Il n'y a pas de premier élément ou de dernier élément. Les valeurs ne sont pas censées être stockées de manière contiguë, comme c'est le cas pour un tableau ou une liste. Il n'y a pas de relation d'ordre entre les indices.
Ainsi, il n'est pas nécessaire d'utiliser la méthode Add() pour affecter une valeur à un indice qui ajoute un élément à la suite des autres. Tu peux directement affecter des valeurs au dictionnaire en spécifiant l'indice de ton choix :
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary["firstName"] = "Johnm";
dictionary["lastName"] = "Doe";
dictionary.Add("age", "unknown"); // You can use Add() if you want
// Ooops ! I messed up the first name with a trailing 'm'
dictionary["firstName"] = "John";
Ainsi, l'instruction dictionary["firstName"] = "John" va créer en mémoire la case "firstName" si ce n'est pas déjà fait et y associer la valeur "John". La méthode Add() fait exactement la même chose.
C'est bien beau d'ajouter, mais je supprime comment mes indices ?
Tout regarder
Suppression d'un indice et de sa valeur
De manière intuitive, tu penses pouvoir supprimer un élément du tableau en ne lui affectant aucune valeur. Eh bien détrompe-toi, car cela ne marche tout bonnement pas ! Si tu affectes une valeur vide à un indice, eh bien l'indice contiendra ... une valeur vide. Ton indice existera toujours, mais il n'y aura rien à l'intérieur.
Ainsi, pour supprimer un indice et la valeur qu'il contient, tu dois faire appel à la méthode Remove():
Dictionary<char, List<string>> englishDictionary = new Dictionary<char, List<string>>();
englishDictionary['a'] = new List<string> { "abandon", "ability", "able" };
englishDictionary['b'] = new List<string> { "ballad", "be", "broad"};
[...]
englishDictionary.Remove('a');
Taille d'un dictionnaire
Même si les valeurs ne sont pas stockées de manière contiguë, ton dictionnaire fait une certaine taille puisque c'est une collection. Il peut aussi être utile de récupérer des informations sur sa taille.
La taille d'un dictionnaire se trouve dans la propriété Count:
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary["message"] = "Hello, world !";
dictionary.Add("address", "0, road to nowhere");
int dictionarySize = dictionary.Count; // Equals to 2
Challenge
Manipuler un dictionnaire
Je veux que tu commences ton dictionnaire avec trois lettres: 'a', 'b' et 'c'. Je veux que tu associes trois mots à ces trois lettres.
J'ai aussi besoin que tu me prouves que tu sais faire le ménage. Supprime-moi la lettre 'c' après l'avoir créée.
Merci, et bon courage !
Critères de validation
- Un lien vers ta solution sur GitHub