Per rispondere alla domanda prima dobbiamo dare un'occhiata allo scopo di un dizionario e alla tecnologia sottostante.
Dictionary
è l'elenco di KeyValuePair<Tkey, Tvalue>
dove ogni valore è rappresentato dalla sua chiave univoca. Diciamo che abbiamo un elenco dei tuoi cibi preferiti. Ogni valore (nome del cibo) è rappresentato dalla sua chiave univoca (una posizione = quanto ti piace questo cibo).
Codice di esempio:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
Diciamo che vuoi restare in salute, hai cambiato idea e vuoi sostituire il tuo "Burger" preferito con l'insalata. Il tuo elenco è ancora un elenco dei tuoi preferiti, non cambierai la natura dell'elenco. Il tuo preferito rimarrà il numero uno della lista, solo il suo valore cambierà. Questo è quando lo chiami:
/*your key stays 1, you only replace the value assigned to this key
you alter existing record in your dictionary*/
myDietFavorites[1] = "Salad";
Ma non dimenticare che sei il programmatore e da ora in poi finisci le tue frasi con; ti rifiuti di usare gli emoji perché genererebbero un errore di compilazione e tutto l'elenco dei preferiti è basato su 0 indice.
Anche la tua dieta è cambiata! Quindi modifichi di nuovo la tua lista:
/*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");
Ci sono due possibilità con la definizione, o vuoi dare una nuova definizione per qualcosa che non esisteva prima o vuoi cambiare la definizione che già esiste.
Il metodo Aggiungi ti consente di aggiungere un record ma solo a una condizione: la chiave per questa definizione potrebbe non esistere nel dizionario.
Ora guarderemo sotto il cofano. Quando si crea un dizionario, il compilatore effettua una prenotazione per il bucket (spazi in memoria per archiviare i record). Bucket non memorizza le chiavi nel modo in cui le definisci. Ogni chiave viene sottoposta ad hashing prima di passare al bucket (definito da Microsoft), vale la pena ricordare che la parte del valore rimane invariata.
Userò l'algoritmo di hashing CRC32 per semplificare il mio esempio. Quando definisci:
myDietFavorites[0] = "Pizza";
Quello che sta per finire nel secchio è db2dc565 "Pizza" (semplificato).
Quando modifichi il valore con:
myDietFavorites[0] = "Spaghetti";
Hai cancellato il tuo 0 che è di nuovo db2dc565, quindi cerchi questo valore nel tuo bucket per trovare se è lì. Se è lì, riscrivi semplicemente il valore assegnato alla chiave. Se non è lì, metterai il tuo valore nel secchio.
Quando chiami la funzione Aggiungi sul tuo dizionario come:
myDietFavorite.Add(0, "Chocolate");
Hai cancellato il tuo 0 per confrontare il suo valore con quelli nel secchio. Puoi metterlo nel secchio solo se non è lì .
È fondamentale sapere come funziona, soprattutto se lavori con dizionari di stringhe o caratteri di chiave. Fa distinzione tra maiuscole e minuscole a causa dell'hashing. Quindi per esempio "nome"! = "Nome". Usiamo il nostro CRC32 per descrivere questo.
Il valore per "nome" è: e04112b1 Il
valore per "Nome" è: 1107fb5b