2015-03-16 18 views
12

Sono nuovo alla programmazione .NET. Scusa se questa domanda è stata già chiesta.F #: Differenza tra dizionario, Hashtable e Mappa

Attualmente sto imparando F #. Quali sono le differenze tra Dizionario, Hashtable e Mappa? Quando dovrei usare ciascuno?

Ho anche un'altra domanda che non è menzionata nel titolo. Quando dovrei usare Async.RunSynchronously? Mi sembra piuttosto contraddittorio, quindi sono sicuro che mi manca qualcosa.

risposta

18

La scelta tra Dizionario, Hashtable e Mappa dipende dai casi di utilizzo. Dovresti comunque conoscere le caratteristiche di ciascuno. Questo non è un elenco esaustivo, ma solo alcune differenze fondamentali che si potrebbe desiderare di iniziare da:

  • Hashtable rappresenta un insieme di coppie chiave/valore che sono organizzate in base al codice hash della chiave. Questa è una raccolta mutevole da .NET BCL
  • Dizionario <> questa è un'implementazione generica della tabella hash. Anche una collezione mutevole da .NET BCL
  • Mappa Questo è il tipo immutabile F #. È implementato sulla base di alberi AVL che è una struttura di dati completamente diversa con caratteristiche di prestazioni e casi d'uso diversi.

Se si stanno eseguendo molte scritture, le raccolte di tabelle hash hanno prestazioni di riempimento molto migliori rispetto agli alberi AVL.

Il recupero di un valore da un dizionario tramite la sua chiave è molto veloce, vicino a O (1), perché la classe Dizionario è implementata come tabella hash.

Le mappe F # sono implementate come alberi AVL immutabili, una struttura dati efficiente che forma un albero binario autobilanciato. Gli alberi AVL sono noti per la loro efficienza, in cui possono cercare, inserire ed eliminare elementi nell'albero in O (log n) time, dove n è il numero di elementi nell'albero.

Per quanto riguarda il caso di utilizzo della mappa, se hai una serie di dati statici (come i dati di configurazione che vengono caricati all'avvio dell'applicazione) devi cercare spesso, una mappa è una buona scelta come qualsiasi, la sua immutabilità in questo caso assicura che i dati statici non possano essere modificati per errore e abbiano un impatto ridotto sulle prestazioni, poiché non è necessario modificarli una volta inizializzati.

Async.RunSynchronously esegue il calcolo asincrono fornito e attende il suo risultato. Puoi usarlo nella finestra interattiva F # per esempio per testare i tuoi flussi di lavoro asincroni.

+2

Come Thomas indica che scegliere il contenitore associativo giusto dipende dai casi d'uso ma poiché le mappe sono immutabili si può sostenere che si adattano meglio allo stile funzionale. – FuleSnabel

Problemi correlati