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 aquiHashSet
é 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 aquiExistem 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 normalList
. 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 arquivoHashSet
emList
e iterar por meio dele. Dê uma olhada aquifonte
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 umHashSet
(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 é adicionadoHashSet
, é 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.
fonte
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éricoList<T>
, mas é otimizado para pesquisas rápidas (via hashtables, como o nome indica) ao custo da perda de ordem.fonte
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 elementosHashSet
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.fonte