Para responder a la pregunta primero, tenemos que 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 tus comidas favoritas. Cada valor (nombre del alimento) está representado por su clave única (una posición = cuánto te gusta este alimento).
código Ejemplo:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
Digamos que usted desea permanecer sano, que ha cambiado de opinión y desea reemplazar su "hamburguesa" favorito con ensalada. Su lista sigue siendo una lista de sus favoritos, no cambiará la naturaleza de la lista. Tu favorito seguirá siendo el número uno en la lista, solo cambiará su valor. Esto es cuando usted llama 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 olvide que usted es el programador, y de ahora en adelante termina sus oraciones con; te niegas a usar emojis porque arrojarían un error de compilación y toda la lista de favoritos está basada en el índice 0.
¡Tu dieta también cambió! Por lo que modificar su 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, ya sea que quieren dar una nueva definición de algo no existente antes o usted quiere cambiar la definición que ya existe.
Agregar método 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 claves de la forma en que las define.Cada clave es hash antes de ir al cubo (definido por Microsoft), vale la pena mencionar que la parte del valor permanece sin cambios.
Voy a utilizar el algoritmo de hash CRC32 para simplificar mi ejemplo. Al definir:
myDietFavorites[0] = "Pizza";
Lo que se va a la cubeta es db2dc565 "Pizza" (simplificado).
Cuando se altera el valor con:
myDietFavorites[0] = "Spaghetti";
Usted hash su 0 que es otra vez db2dc565 entonces miras a este valor en su cubo para encontrar si está allí. Si está allí, simplemente reescribe el valor asignado a la tecla. Si no está allí, colocará su valor en el cubo.
Al llamar a la función Añadir en su diccionario como:
myDietFavorite.Add(0, "Chocolate");
Usted hash su 0 a comparar su valor a los de la cubeta. Puede colocarlo en el cubo solo si no está allí.
Es crucial saber cómo funciona, especialmente si trabaja con diccionarios de cadena o tipo de clave de caracteres. Es sensible a mayúsculas y minúsculas debido a someterse a hash. Entonces, por ejemplo, "nombre"! = "Nombre". Usemos nuestro CRC32 para representar esto.
valor de "nombre" es: e04112b1 valor de "Nombre" es: 1107fb5b
+1 Muy interesante, gracias por su publicación! Parecería que el rendimiento es casi idéntico aquí, como los otros carteles han insinuado, de todos modos gran hallazgo :) –