Como o Dicionário é mantido internamente?

Quando eu digo

Dictionary 

é equivalente a dois arrays diferentes, como:

 int[] keys =new int[] { 1, 2, 3 }; string[] values=new string[]{"val1","val2","val3"}; 

Isso não está muito longe. Olhando para o código-fonte no Reflector, parece que três collections internas são usadas:

 private Entry[] entries; private KeyCollection keys; private ValueCollection values; 

Observe que também há uma variável int[] buckets para acompanhar os intervalos necessários no caso de colisões com hash-code.

Os objectives dessas variables ​​devem ser todos auto-explicativos. Isto não é particularmente surpreendente, de qualquer forma, uma vez que a class Dictionary é conhecida e documentada para fornecer (idealmente, com um item por balde) O(1) tempo de pesquisa.

É hashtable. Para cada chave, o Dictionary calcula seu código de hash e usa isso como um ponteiro para colocar onde o valor deve residir. Se houver duas chaves correspondentes ao mesmo código de hash, tal situação é chamada de colisão e internamente para este caso especial. O Dictionary usa a tree binária.

A complexidade algorítmica do Dictionary (hashtable) é O (1) e, no pior dos casos, O (log (N)) (no pior dos casos significa que lidamos apenas com colisões), onde N é um número de elementos no Dictionary.

Está tudo claramente escrito no MSDN :

A class genérica Dictionary (Of TKey, TValue) fornece um mapeamento de um conjunto de chaves para um conjunto de valores. Cada adição ao dictionary consiste em um valor e sua chave associada. Recuperar um valor usando sua chave é muito rápido, perto de O (1), porque a class Dictionary (Of TKey, TValue) é implementada como uma tabela de hash.

Não, é uma tabela de hash. Bem, não é exatamente uma tabela de hash, mas está intimamente relacionada.

http://en.wikipedia.org/wiki/Hash_table .

http://www.kirupa.com/net/dictionary_hashtable.htm