Pour répondre à la question, nous devons d'abord examiner le but d'un dictionnaire et la technologie sous-jacente.
Dictionary
est la liste KeyValuePair<Tkey, Tvalue>
où chaque valeur est représentée par sa clé unique. Disons que nous avons une liste de vos aliments préférés. Chaque valeur (nom de l'aliment) est représentée par sa clé unique (une position = combien vous aimez cet aliment).
Exemple de code:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
Disons que vous voulez rester en bonne santé, que vous avez changé d'avis et que vous voulez remplacer votre "Burger" préféré par une salade. Votre liste est toujours une liste de vos favoris, vous ne changerez pas la nature de la liste. Votre favori restera numéro un sur la liste, seule sa valeur changera. C'est à ce moment que vous appelez ceci:
/*your key stays 1, you only replace the value assigned to this key
you alter existing record in your dictionary*/
myDietFavorites[1] = "Salad";
Mais n'oubliez pas que vous êtes le programmeur, et à partir de maintenant vous finissez vos phrases avec; vous refusez d'utiliser des emojis car ils généreraient une erreur de compilation et toute la liste des favoris est basée sur un index 0.
Votre alimentation a également changé! Vous modifiez donc à nouveau votre liste:
/*you don't want to replace Salad, you want to add this new fancy 0
position to your list. It wasn't there before so you can either define it*/
myDietFavorites[0] = "Pizza";
/*or Add it*/
myDietFavorites.Add(0, "Pizza");
Il y a deux possibilités avec la définition, soit vous voulez donner une nouvelle définition pour quelque chose qui n'existait pas auparavant, soit vous voulez changer la définition qui existe déjà.
La méthode Add vous permet d'ajouter un enregistrement mais à une seule condition: la clé de cette définition peut ne pas exister dans votre dictionnaire.
Maintenant, nous allons regarder sous le capot. Lorsque vous créez un dictionnaire, votre compilateur effectue une réservation pour le bucket (espaces en mémoire pour stocker vos enregistrements). Le bucket ne stocke pas les clés de la manière dont vous les définissez. Chaque clé est hachée avant d'aller dans le compartiment (défini par Microsoft), il convient de mentionner que la partie valeur reste inchangée.
J'utiliserai l'algorithme de hachage CRC32 pour simplifier mon exemple. Lorsque vous définissez:
myDietFavorites[0] = "Pizza";
Ce qui va dans le seau est db2dc565 "Pizza" (simplifié).
Lorsque vous modifiez la valeur avec:
myDietFavorites[0] = "Spaghetti";
Vous hachez votre 0 qui est à nouveau db2dc565 puis vous recherchez cette valeur dans votre bucket pour savoir si elle est là. Si c'est là, vous réécrivez simplement la valeur assignée à la clé. Si ce n'est pas là, vous placerez votre valeur dans le seau.
Lorsque vous appelez la fonction Ajouter sur votre dictionnaire comme:
myDietFavorite.Add(0, "Chocolate");
Vous hachez votre 0 pour comparer sa valeur à celles du compartiment. Vous ne pouvez le placer dans le seau que s'il n'y est pas .
Il est crucial de savoir comment cela fonctionne, surtout si vous travaillez avec des dictionnaires de clé de type chaîne ou char. Il est sensible à la casse en raison du hachage. Donc par exemple "nom"! = "Nom". Utilisons notre CRC32 pour illustrer cela.
La valeur de «nom» est: e04112b1 La
valeur de «nom» est: 1107fb5b