Programmation .Net - Indépendance financière

Le Dictionary Collections.Generic en Visual Basic/C#

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é.

Dictionary

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.

YouTube

Next article La (Queue/File) Collections.Generic en Visual Basic/C#
Previous article La List Collections.Generic en Visual Basic/C#

Related posts

0 Comments

No Comments Yet!

You can be first to comment this post!

Leave a Comment

Your data will be safe! Your e-mail address will not be published. Also other data will not be shared with third person. Required fields marked as *