HashSet A estrutura de dados do C # HashSet foi introduzida no .NET Framework 3.5. Uma lista completa dos membros implementados pode ser encontrada na página HashSet MSDN .
- Onde é usado?
- Por que você gostaria de usá-lo?
HashSet A estrutura de dados do C # HashSet foi introduzida no .NET Framework 3.5. Uma lista completa dos membros implementados pode ser encontrada na página HashSet MSDN .
Respostas:
A HashSet
contém um conjunto de objetos, mas de uma maneira que permite determinar com facilidade e rapidez se um objeto já está no conjunto ou não. Isso é feito gerenciando internamente uma matriz e armazenando o objeto usando um índice calculado a partir do código hash do objeto. Dê uma olhada aqui
HashSet
é uma coleção não ordenada que contém elementos exclusivos. Possui as operações de coleta padrão Adicionar, Remover, Contém, mas, como usa uma implementação baseada em hash, essas operações são O (1). (Ao contrário de Lista, por exemplo, que é O (n) para Contém e Remover.) HashSet
Também fornece operações de conjunto padrão, como união , interseção e diferença simétrica . Dê uma olhada aqui
Existem diferentes implementações de conjuntos. Alguns tornam as operações de inserção e pesquisa super rápidas, usando elementos de hash. No entanto, isso significa que a ordem na qual os elementos foram adicionados é perdida. Outras implementações preservam a ordem adicionada ao custo de tempos de execução mais lentos.
A HashSet
classe em C # segue a primeira abordagem, não preservando a ordem dos elementos. É muito mais rápido que o normal List
. Alguns benchmarks básicos mostraram que o HashSet é decentemente mais rápido ao lidar com tipos primários (int, double, bool, etc.). É muito mais rápido ao trabalhar com objetos de classe. Portanto, esse ponto é que o HashSet é rápido.
O único problema HashSet
é que não há acesso por índices. Para acessar elementos, você pode usar um enumerador ou a função interna para converter o arquivo HashSet
em List
e iterar por meio dele. Dê uma olhada aqui
A HashSet
possui uma estrutura interna (hash), na qual os itens podem ser pesquisados e identificados rapidamente. A desvantagem é que a iteração através de um HashSet
(ou a obtenção de um item pelo índice) é bastante lenta.
Então, por que alguém gostaria de saber se uma entrada já existe em um conjunto?
Uma situação em que a HashSet
é útil é obter valores distintos de uma lista em que podem existir duplicatas. Depois que um item é adicionado HashSet
, é rápido determinar se o item existe ( Contains
operador).
Outras vantagens do HashSet
são as operações Set: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
.
Se você estiver familiarizado com a linguagem de restrição de objetos , identificará essas operações definidas. Você também verá que está um passo mais perto de uma implementação de UML executável.
Simplesmente dito e sem revelar os segredos da cozinha:
um conjunto em geral é uma coleção que não contém elementos duplicados e cujos elementos não estão em uma ordem específica. Portanto, A HashSet<T>
é semelhante a um genérico List<T>
, mas é otimizado para pesquisas rápidas (via hashtables, como o nome indica) ao custo da perda de ordem.
Do ponto de vista do aplicativo, se é necessário apenas evitar duplicatas, HashSet
é o que você está procurando, já que as complexidades de Pesquisa, Inserir e Remover são O (1) - constantes . Isso significa que não importa quantos elementos HashSet
possuam, levará a mesma quantidade de tempo para verificar se existe ou não esse elemento. Além disso, como você está inserindo elementos em O (1), também é perfeito para esse tipo de coisa.