On peut voir le Dictionary comme une List très accélérée. Pourquoi? On retrouve la réponse dans la façon avec laquelle le Dictionary traite l’information. Sachez tout d’abord que vous devrez entrer deux types plutôt qu’un seul, soit un pour la clé et l’autre pour la valeur qui sera associée à cette clé. Rappelez-vous qu’au contraire de la List, le Dictionary fonctionne avec des clés, soit, chaque valeur est liée à une clé. Voici donc comment on fait la déclaration et l’initialisation d’un Dictionary en Visual Basic et C#.
Visual Basic
Option Explicit On Option Strict On Module Program Sub Main() Dim MyDictionary = New Dictionary(Of Integer, String) End Sub End Module
C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DictionaryCSharp { class Program { static void Main(string[] args) { Dictionary<int, string> myDictionary = new Dictionary<int, string>(); } } }
Comme vous pouvez voir, ça ressemble beaucoup à la déclaration et l’initialisation d’une List, à l’exception des deux types T et T2, soit Integer pour les clés et String pour les valeurs. C’est donc dire que la List comprendra des clés de type Integer pour retrouver des valeurs de type String. Par exemple, imaginons que nous avons des étudiants portant tous des numéros à 5 chiffres uniques, alors ce sera notre clé, et la valeur sera leur nom. Encore une fois, gardez en tête que vous avez le choix du type des clés et des valeurs.
Pourquoi le Dictionary plutôt que la List?
Imaginez que vous ayez une List de 50 000 étudiants. Il se peut que ça prenne beaucoup de temps avant que la List soit parcourue si l’on utilise un ForEach. Dans un Dictionary, il est possible de retrouver l’étudiant presque instantanément en utilisant sont ID (clé). Donc si vous voyez une situation dans laquelle vous avez en votre possession des clés et des valeurs associées, il est très probable que le Dictionary s’applique comme structure de données de choix.
Notez que la sélection d’une structure de données doit se faire de façon judicieuse, je vous suggère donc de bien vérifier les specs de ce que vous désirez accomplir avant de prendre une décision.
Pour faire une comparaison, vous pouvez penser à une vrai bibliothèque. Si vous cherchez un livre, vous irez naturellement utiliser l’ordinateur pour trouver le code de votre livre et ainsi le repérer rapidement dans les rayons. Ceci est comme un Dictionary. La recherche d’une List serait plutôt illustrée par le fait de chercher les livres un par un en commençant par le premier rayon, ensuite le second et ainsi de suite. Ce n’est pas si mal si votre livre se trouve au début, mais s’il est à la fin, la recherche sera longue!
En arrière plan, le Dictionary utilise ce que l’on appelle un Hash Table. Qu’est-ce qu’un Hash Table? Il s’agit d’un tableau ou de multiples tableaux étant organisés de façon à pouvoir Hasher une clé particulière pour être guidé vers un Index. Par exemple, si j’ai la clé 5, il se peut que mon algorithme de Hashage me donne 1, alors il s’agit de l’élément à la position 1 dans le tableau, même si ma clé est 5. En bref, avec la clé, vous pouvez trouver une valeur presque instantanément. Si vous désirez plus d’information sur les tables de hachage, vous pouvez visiter ce site Web.
Voici un exemple pour illustrer la recherche d’une valeur à partir d’une clé.
La première étape est de donner la clé pour ensuite hacher celle-ci et retrouver la valeur en question.
Méthodes utiles à l’utilisation du Dictionary
Add(T Key, T2 Value)
Ajoute simplement une nouvelle clé et valeur associée au Dictionary, cette opération est similaire à l’ajout dans une List standard à l’exception que l’élément comporte deux parties, soit la clé et sa valeur.
Voici un exemple d’utilisation.
Visual Basic
MyDictionary.Add(4, "Alexandre") MyDictionary.Add(40, "Maxime") MyDictionary.Add(10, "Daniel")
C#
myDictionary.Add(4, "Alexandre"); myDictionary.Add(40, "Maxime"); myDictionary.Add(10, "Daniel");
Ce code ajoute 3 éléments au Dictionary, rappelez-vous que le type de la clé est de type Integer, soit le premier argument et le type de la valeur est de type String, soit le deuxième argument. Si vous aviez initialisé votre Dictionary avec String, vous auriez pu mettre des clés sous forme de chaines de caractères, par exemple “AlexStudentID59403”.
TryGetValue(T Index, ByRef T2 Value)
Cette méthode retourne une valeur de type Boolean nous indiquant si l’opération a été effectuée avec succès. De plus, elle comprend une petite difficulté, c’est à dire que le deuxième argument est passé en ByRef, vous devez donc déclarer la variable à l’extérieur de la fonction et ainsi passer cette valeur qui sera modifiée dans le cas où l’exécution se déroulera comme prévue. Vous aurez alors la valeur désirée dans la variable. Voici un exemple.
Visual Basic
Dim RetrievedValue As String = String.Empty If MyDictionary.TryGetValue(4, RetrievedValue) Then Console.WriteLine("Student number 4 is {0}", RetrievedValue) End If
C#
string retrievedValue = String.Empty; if (myDictionary.TryGetValue(4, out retrievedValue)) Console.WriteLine("Student number 4 is {0}", retrievedValue);
Vous pouvez constater que j’ai créé une variable nommée RetrievedValue avec une chaine vide à l’intérieur. C’est que lorsque le procéssus sera exécuté, la valeur retrouvée, si elle existe, sera mise, par la fonction, dans RetrievedValue. Ceci permettra son utilisation par la suite. On peut compter cela comme une utilité du ByRef, soit de pouvoir modifier, à l’intérieur de la fonction, des variables n’étant pas dans son scope.
Remove(T Key)
La méthode Remove(T Key) est aussi similaire à celle de List, vous devez passer en argument la clé de l’élément à supprimer. Si l’élément a été supprimé, vous aurez alors une valeur Boolean en retour True, sinon, un retour False.
Visual Basic
If MyDictionary.Remove(40) Then Console.WriteLine("Student 40 has been removed!") Else Console.WriteLine("Cannot find student with number 40.") End If
C#
if (myDictionary.Remove(40)) Console.WriteLine("Student 40 has been removed!"); else Console.WriteLine("Cannot find student with number 40.");
Contains
Vous pouvez utiliser Contains, toutefois avec une petite variate qui est ContainsKey(T Key) et ContainsValue(T2 Value).
Visual Basic
If MyDictionary.ContainsKey(4) Then Console.WriteLine("Dictionary contains the student number 4!") End If
C#
if (myDictionary.ContainsKey(4)) Console.WriteLine("Dictionary contains the student number 4!");
D’autres méthodes?
Les autres méthodes sont similaires à celles de la List, et c’est ce qui est bien avec les Collections.Generic. Ils partagent des méthodes les unes et les autres, ce qui rend notre vie plus facile!
Encore une fois, il est important de toujours garder en tête que la recherche dans le Dictionary est plus rapide mais que ce n’est pas toujours le choix le plus judicieux, vous devez vraiment réfléchir selon vos besoins, quelle sera la collection la plus appropriée.
Code complet
Voici le code complet pour cet exemple!
Visual Basic
Option Explicit On Option Strict On Module Program Sub Main() 'Déclaration et initialisation d'un nouveau Dictionary avec la clé de type Integer et la valeur de type String Dim MyDictionary = New Dictionary(Of Integer, String) 'Ajout de valeurs en utilisant la méthode Add MyDictionary.Add(4, "Alexandre") MyDictionary.Add(40, "Maxime") MyDictionary.Add(10, "Daniel") Dim RetrievedValue As String = String.Empty 'Recherche de valeurs en utilisant la méthode TryGetValue If MyDictionary.TryGetValue(4, RetrievedValue) Then Console.WriteLine("Student number 4 is {0}", RetrievedValue) End If 'Une autre façon plus rapide d'ajouter et de rechercher des valeurs dans le Dictionary, je trouve la technique plus haute plus sécuritaire toutefois MyDictionary(5) = "Alex" Dim Value As String = MyDictionary(5) Console.WriteLine(Value) 'Suppression d'une valeur dans le Dictionary If MyDictionary.Remove(40) Then Console.WriteLine("Value at key 40 has been removed!") Else Console.WriteLine("Cannot find value at key 40!") End If 'Vérification de l'existence d'une clé dans le Dictionary If MyDictionary.ContainsKey(4) Then Console.WriteLine("Dictionary contains the key 4!") End If Console.ReadKey() End Sub End Module
C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DictionaryCSharp { class Program { static void Main(string[] args) { // Déclaration et initialisation d'un nouveau Dictionary avec la clé de type Integer et la valeur de type String. Dictionary<int, string> myDictionary = new Dictionary<int, string>(); // Ajout de valeurs en utilisant la méthode Add. myDictionary.Add(4, "Alexandre"); myDictionary.Add(40, "Maxime"); myDictionary.Add(10, "Daniel"); // Recherche de valeurs en utilisant la méthode TryGetValue. string retrievedValue = String.Empty; if (myDictionary.TryGetValue(4, out retrievedValue)) Console.WriteLine("Student number 4 is {0}", retrievedValue); // Une autre façon plus rapide d'ajouter et de rechercher des valeurs dans le Dictionary, je trouve la technique plus haute plus sécuritaire toutefois. myDictionary[5] = "Alex"; string studentFiveValue = myDictionary[5]; Console.WriteLine("Value for student number 5: {0}", studentFiveValue); // Suppression d'une valeur dans le Dictionary. if (myDictionary.Remove(40)) Console.WriteLine("Student 40 has been removed!"); else Console.WriteLine("Cannot find student with number 40."); // Vérification de l'existence d'une clé dans le Dictionary. if (myDictionary.ContainsKey(4)) Console.WriteLine("Dictionary contains the student number 4!"); Console.ReadKey(); } } }
Note: n’oubliez pas de changer le namespace de mon projet (DictionaryCSharp) pour le vôtre.
No Comments Yet!
You can be first to comment this post!