Partilhar via


Tipos de coleção Hashtable e Dictionary

A System.Collections.Hashtable classe e as System.Collections.Generic.Dictionary<TKey,TValue> System.Collections.Concurrent.ConcurrentDictionary<TKey,TValue> classes genéricas implementam a System.Collections.IDictionary interface. A Dictionary<TKey,TValue> classe generic também implementa a IDictionary<TKey,TValue> interface genérica. Portanto, cada elemento nessas coleções é um par chave-e-valor.

Um Hashtable objeto consiste em buckets que contêm os elementos da coleção. Um bucket é um subgrupo virtual de elementos dentro do , o que torna a pesquisa e a Hashtablerecuperação mais fáceis e rápidas do que na maioria das coleções. Cada bucket é associado a um código hash, que é gerado usando uma função hash e é baseado na chave do elemento.

A classe genérica HashSet<T> é uma coleção não ordenada por conter elementos exclusivos.

Uma função hash é um algoritmo que retorna um código hash numérico baseado em uma chave. A chave é o valor de alguma propriedade do objeto que está sendo armazenado. Uma função hash deve sempre retornar o mesmo código hash para a mesma chave. É possível que uma função hash gere o mesmo código hash para duas chaves diferentes, mas uma função hash que gera um código hash exclusivo para cada chave exclusiva resulta em melhor desempenho ao recuperar elementos da tabela de hash.

Cada objeto que é usado como um elemento em um Hashtable deve ser capaz de gerar um código hash para si mesmo usando uma implementação do GetHashCode método. No entanto, você também pode especificar uma função hash para todos os elementos em um Hashtable usando um Hashtable construtor que aceita uma IHashCodeProvider implementação como um de seus parâmetros.

Quando um objeto é adicionado a um Hashtable, ele é armazenado no bucket associado ao código hash que corresponde ao código hash do objeto. Quando um valor está sendo pesquisado Hashtableno , o código hash é gerado para esse valor, e o bucket associado a esse código hash é pesquisado.

Por exemplo, uma função de hash para uma cadeia de caracteres pode pegar os códigos ASCII de cada caractere na cadeia de caracteres e adicioná-los para gerar um código hash. A string "picnic" teria um código hash diferente do código hash para a string "basket"; portanto, as cordas "piquenique" e "cesto" estariam em baldes diferentes. Em contraste, "estressado" e "sobremesas" teriam o mesmo código hash e estariam no mesmo balde.

As Dictionary<TKey,TValue> classes e ConcurrentDictionary<TKey,TValue> têm a mesma funcionalidade que a Hashtable classe. A Dictionary<TKey,TValue> de um tipo específico (diferente de Object) fornece melhor desempenho do que a Hashtable para tipos de valor. Isso ocorre porque os elementos de são do tipoObject, portanto, boxing e unboxing normalmente ocorrem quando você armazena ou recupera um tipo de Hashtable valor. A ConcurrentDictionary<TKey,TValue> classe deve ser usada quando vários threads podem estar acessando a coleção simultaneamente.

Consulte também