Sembra che C # fornisca entrambi (sebbene uno sia chiamato con un bizzarro nome) quindi vorrei solo commentare perché avere entrambi i tipi è generalmente (non solo in C #, di cui conosco poco) una buona idea.
Ci sono fondamentalmente due modi per implementare una mappa / dizionario. Puoi usare un albero binario bilanciato o puoi usare una tabella hash. Il primo non è ordinato in quanto è possibile scorrere i membri in ordine di chiave, e il secondo no. La capacità di scorrere in ordine è importante in (per esempio) molte applicazioni di elaborazione del testo.
Le mappe ad albero hanno un altro vantaggio: hanno solo bisogno dei tipi in esse per fornire operatori di confronto, dove le cose nelle mappe basate su hash devono fornire una funzione di hash. La maggior parte dei programmatori ha pochi problemi nell'implementazione del confronto, ma una buona funzione di hash può essere molto difficile da implementare.
Sfortunatamente, le mappe ad albero sono generalmente un po 'meno efficienti di quelle con hash. Le mie indagini in C ++ indicano che gli hash sono circa il doppio (il che non è una grande differenza). Ma questo è solo nel caso generale - per esempio, le mappe in cui le chiavi sono stringhe molto lunghe saranno probabilmente implementate in modo più efficiente usando le btrees, poiché la funzione di confronto non deve considerare l'intera stringa, ma la funzione hash lo fa.
Quindi ce l'hai, entrambi i tipi hanno il loro posto nel toolkit di un buon programmatore.