Para responder a la pregunta, primero debemos echar un vistazo al propósito de un diccionario y la tecnología subyacente.
Dictionary
es la lista de KeyValuePair<Tkey, Tvalue>
donde cada valor está representado por su clave única. Digamos que tenemos una lista de sus comidas favoritas. Cada valor (nombre del alimento) está representado por su clave única (una posición = cuánto le gusta este alimento).
Código de ejemplo:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
Digamos que desea mantenerse saludable, ha cambiado de opinión y desea reemplazar su "hamburguesa" favorita con ensalada. Su lista sigue siendo una lista de sus favoritos, no cambiará la naturaleza de la lista. Su favorito seguirá siendo el número uno en la lista, solo cambiará su valor. Aquí es cuando llamas a esto:
/*your key stays 1, you only replace the value assigned to this key
you alter existing record in your dictionary*/
myDietFavorites[1] = "Salad";
Pero no olvides que eres el programador ya partir de ahora terminas tus frases con; te niegas a usar emojis porque arrojarían un error de compilación y toda la lista de favoritos se basa en un índice 0.
¡Tu dieta también cambió! Entonces modificas tu lista de nuevo:
/*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");
Hay dos posibilidades con la definición, o desea dar una nueva definición para algo que no existía antes o desea cambiar la definición que ya existe.
El método Agregar le permite agregar un registro, pero solo bajo una condición: la clave para esta definición puede no existir en su diccionario.
Ahora vamos a mirar debajo del capó. Cuando está haciendo un diccionario, su compilador hace una reserva para el depósito (espacios en la memoria para almacenar sus registros). Bucket no almacena las claves de la forma en que las define. Cada clave tiene un hash antes de ir al depósito (definido por Microsoft), vale la pena mencionar que la parte del valor permanece sin cambios.
Usaré el algoritmo hash CRC32 para simplificar mi ejemplo. Al definir:
myDietFavorites[0] = "Pizza";
Lo que va al cubo es db2dc565 "Pizza" (simplificado).
Cuando altera el valor con:
myDietFavorites[0] = "Spaghetti";
Pones tu 0 que es de nuevo db2dc565 luego buscas este valor en tu depósito para encontrar si está allí. Si está allí, simplemente vuelva a escribir el valor asignado a la clave. Si no está allí, pondrá su valor en el cubo.
Cuando llama a la función Agregar en su diccionario como:
myDietFavorite.Add(0, "Chocolate");
Pones un hash en tu 0 para comparar su valor con los del cubo. Puede colocarlo en el balde solo si no está allí .
Es crucial saber cómo funciona, especialmente si trabaja con diccionarios de clave de tipo cadena o char. Es sensible a mayúsculas y minúsculas debido a que se somete a hash. Por ejemplo, "nombre"! = "Nombre". Usemos nuestro CRC32 para representar esto.
El valor de "nombre" es: e04112b1 El
valor de "Nombre" es: 1107fb5b