Les dictionnaires

Un dictionnaire est une structure de données possédant des paires de clés/valeurs. Contrairement au liste, les valeurs ne sont pas identifiables à un index mais à leur clé qui peut être de tout type (string, int, ect…).

// Création du dictionnaire.
Dictionary<string, string> openWith = new Dictionary<string, string>();

// Création du dictionnaire avec une taille définie à 10 dans le but d'optimiser les performances.
Dictionary<string, string> openWith = new Dictionary<string, string>(10);

// Ajout de quelques éléments. Il ne peut pas y avoir
// deux clefs identiques mais les valeurs peuvent l'être.
openWith.Add("txt", "notepad.exe");
openWith.Add("bmp", "paint.exe");
openWith.Add("dib", "paint.exe");
openWith.Add("rtf", "wordpad.exe");

// La méthode Add lance une exception si
// la clef existe déjà.
try
{
	openWith.Add("txt", "winword.exe");
}
catch (ArgumentException)
{
	Console.WriteLine("Un élément possède déjà la clef \"txt\".");
}

// Comme pour un tableau, vous pouvez utiliser un indexeur (avec les crochets : '[' et ']').
// Avec un tableau l'indexeur est un entier positif tandis
// que pour un dictionnaire ce doit être une clef
// (donc ici de type string).
Console.WriteLine(
	"La valeur associée à la clef \"rtf\" est {0}.",
	openWith["rtf"]);

// L'indexeur peut aussi être utilisé en écriture.
openWith["rtf"] = "winword.exe";
Console.WriteLine(
	"La nouvelle valeur associée à la clef \"rtf\" est {0}.",
	openWith["rtf"]);

// Si la clef n'existe pas déjà, l'utilisation de l'indexeur
// crée un nouveau couple clef/valeur.
openWith["doc"] = "winword.exe";

// L'indexeur lance une exception si la clef
// n'est pas définie dans le dictionnaire.
try
{
	Console.WriteLine(
		"La valeur associée à la clef \"tif\" est {0}.",
		openWith["tif"]);
}
catch (KeyNotFoundException)
{
	Console.WriteLine("La clef \"tif\" est introuvable.");
}

// Si vous voulez accéder à plusieurs clefs, sans savoir si elles existent,
// le plus rapide est d'utiliser la méthode TryGetValue plutôt
// que d'utiliser des try ... catch.
// Si la valeur a pu être récupérée, elle est mise dans le paramètre value passé avec out
// et la méthode retourne true ; sinon elle retourne false.
string value = string.Empty;
if (openWith.TryGetValue("tif", out value))
{
	Console.WriteLine(
		"La valeur associée à la clef \"tif\" est {0}.",
		value);
}
else
{
	Console.WriteLine("La clef \"tif\" est introuvable.");
}

// La méthode ContainsKey permet de savoir si la clef existe déjà ou non.
// Elle retourne true si la clef existe déjà et false sinon.
if (!openWith.ContainsKey("ht"))
{
	openWith.Add("ht", "hypertrm.exe");
	Console.WriteLine(
		"Ajout de la clef \"ht\" avec la valeur {0}.",
		openWith["ht"]);
}

// La méthode Remove permet de supprimer une paire clef/valeur.
Console.WriteLine("Suppression de la clef \"doc\" et de la valeur associée.");
openWith.Remove("doc");

if (!openWith.ContainsKey("doc"))
{
	Console.WriteLine("La clef \"doc\" est introuvable.");
}

// Count indique le nombre de paires stockées.
Console.WriteLine(
	"Ce dictionnaire contient {0} paires.",
	openWith.Count);

// La méthode Clear permet de supprimer toutes les paires clef/valeur.
openWith.Clear();
Console.WriteLine(
	"Après suppression de toutes les paires, ce dictionnaire contient {0} paires.",
	openWith.Count);

// La méthode Remove permet de supprimer une paire de clef/valeur en lui passant la clé en paramètre.
// Ici nous souhaitons supprimer la paire : ("txt", "notepad.exe")
openWith.Remove("txt");

Console.WriteLine("Liste des clefs :");

// On récupère juste les clefs.
Dictionary<string, string>.KeyCollection myKeyCollection = openWith.Keys;

// On parcourt les clefs (qui sont des objets de type string).
foreach (string key in myKeyCollection)
{
	Console.WriteLine(key);
}

// Le \n sert à faire un retour charriot
// (donc à sauter une ligne car on était déjà revenus à la ligne avec WriteLine)
Console.WriteLine("\nListe des valeurs :");

// On récupère juste les valeurs.
Dictionary<string, string>.ValueCollection myValueCollection = openWith.Values;

// On parcourt les valeurs (qui sont des objets de type string)
foreach (string value in myValueCollection)
{
	Console.WriteLine(value);
}

Console.WriteLine("\nListe des paires clef/valeur :");

// Quand on utilise foreach pour énumérer les éléments du dictionnaire,
// ces éléments sont récupérés en tant que des objets de type KeyValuePair.
foreach (KeyValuePair<string, string> kvp in openWith)
{
	Console.WriteLine(
		"openWith[\"{0}\"] vaut {1}",
		kvp.Key,                                 // On récupère ici la clé du dictionnaire.
		kvp.Value);                              // On récupère ici la valeur correspondant à la clé du dictionnaire.
}