Perché il dizionario (TKey, TValue) non può aggiornare i suoi hashcode?

-1

Ho letto che l'hashcode di un oggetto non dovrebbe cambiare mentre è parte di un dizionario. Perché se fosse cambiato, non ci sarebbe stato modo di trovarlo nel Dizionario.

Perché la classe Dictionary non ha la logica per spostare un oggetto nel bucket corretto quando rileva che l'hashcode dell'oggetto è cambiato?

    
posta Backwards_Dave 01.05.2018 - 08:09
fonte

4 risposte

8

Why doesn't the Dictionary class have logic to move an object to the correct bucket when it detects that the object's hashcode has changed?

Per sicurezza, stiamo parlando dell'hash del key qui, l'hash del valore è irrilevante.

La parte importante del tuo commento è: [...] quando rileva che l'hashcode dell'oggetto è cambiato. ... ma come?

  • L'iterazione continua di tutte le voci nel dizionario sarebbe sia inefficiente che non thread-safe.
  • L'altra opzione prevede che per ogni possibile chiave, è necessario aggiungere un meccanismo di un listener per attivare un evento quando il valore della chiave / codice hash cambia. Sarebbe davvero un PITA e anche inefficiente.

Poiché è piuttosto raro che tu debba modificare le chiavi nel tuo dizionario, è molto più facile ed efficiente rimuovere la voce con la vecchia chiave e aggiungerla di nuovo con la nuova chiave.

    
risposta data 01.05.2018 - 08:33
fonte
6

Risposta breve: Dictionary non può rilevare che alcuni hashcode sono stati modificati. Non c'è nessun evento a cui possa iscriversi. Ottenere hashcode è solo una chiamata a Object.GetHashCode() . Questo metodo viene chiamato una volta quando si inserisce l'oggetto. Per ovvi motivi di rendimento, Dictionary non può chiamare quel metodo per tutti gli oggetti in una raccolta ogni volta che esegui un'operazione su Dictionary .

    
risposta data 01.05.2018 - 08:33
fonte
4

Why doesn't the Dictionary class have logic to move an object to the correct bucket when it detects that the object's hashcode has changed?

Perché ciò sconfigge l'oggetto di un dizionario. L'intero dizionario deve avere un insieme di chiavi immutabile. Poiché la chiave è immutabile, il suo valore hash non cambierà. Se i tuoi valori hash cambiano, significa che le tue chiavi non sono immutabili e un dizionario non è il tipo giusto per te. Dai un'occhiata alla classe KeyedCollection<TKey, TItem> , che è un classe di raccolta astratta che consente di sovrascrivere alcuni comportamenti del dizionario per creare tabelle hash con chiavi mutevoli, ad esempio. Ovviamente è più lento, ma potrebbe adattarsi alle tue esigenze.

    
risposta data 01.05.2018 - 09:31
fonte
4

Se il codice hash della chiave può cambiare, i tasti possono cambiare e le chiavi che sono diverse possono diventare uguali. E ora hai un dizionario con uguali valori e un problema serio.

    
risposta data 01.05.2018 - 19:43
fonte

Leggi altre domande sui tag