Você pode explicar qual é a diferença entre HashSet<T>
e List<T>
no .NET?
Talvez você possa explicar com um exemplo em quais casos HashSet<T>
devem ser preferidos List<T>
?
.net
list
hashset
difference
pencilCake
fonte
fonte
Respostas:
Ao contrário de uma lista <> ...
Um HashSet é uma lista sem membros duplicados.
Como um HashSet é restrito a conter apenas entradas exclusivas, a estrutura interna é otimizada para pesquisa (em comparação com uma lista) - é consideravelmente mais rápido
Adicionar a um HashSet retorna um valor booleano - false se a adição falhar devido a já existir em Set
Pode executar operações matemáticas de conjuntos em relação a um conjunto: união / interseção / IsSubsetOf etc.
HashSet não implementa IList apenas ICollection
Você não pode usar índices com um HashSet, apenas enumeradores.
O principal motivo para usar um HashSet seria se você estiver interessado em executar operações Set.
Dados 2 conjuntos: hashSet1 e hashSet2
voa em comparação com uma operação equivalente usando LINQ. Também é melhor escrever!
fonte
Union
método. Eu tinha usado em seuUnionWith
lugar.Para ser mais preciso, vamos demonstrar com exemplos,
Você não pode usar o HashSet como no exemplo a seguir.
hashSet1[i]
produziria um erro:Você pode usar a instrução foreach:
Você não pode adicionar itens duplicados ao HashSet, enquanto a Lista permite fazer isso e enquanto estiver adicionando um item ao HashSet, é possível verificar se ele contém o item ou não.
HashSet tem algumas funções úteis, como
IntersectWith
,UnionWith
,IsProperSubsetOf
,ExceptWith
,SymmetricExceptWith
etc.IsProperSubsetOf
:UnionWith
:IntersectWith
:ExceptWith
:SymmetricExceptWith
:A propósito, o pedido não é preservado no HashSets. No exemplo, adicionamos o elemento "2" por último, mas está na segunda ordem:
fonte
A
HashSet<T>
é uma classe projetada paraO(1)
procurar pesquisas de contenção (ou seja, essa coleção contém um objeto específico e me responde rapidamente).A
List<T>
é uma classe projetada para fornecer uma coleção comO(1)
acesso aleatório que pode crescer dinamicamente (pense em matriz dinâmica). Você pode testar a contenção noO(n)
tempo (a menos que a lista esteja classificada, poderá fazer uma pesquisa binária noO(log n)
tempo).Quando você deseja testar a contenção no
O(1)
.fonte
Use a
List<T>
quando desejar:Se você conhece o índice do item que deseja (e não o valor do próprio item), é a recuperação
O(1)
. Se você não conhece o índice, encontrar o item leva mais tempoO(n)
para uma coleção não classificada.Use a
Hashset<T>
quando desejar:Se você souber o nome da coisa que deseja encontrar, a Pesquisa é
O(1)
(essa é a parte 'Hash'). Ele não mantém um pedido como oList<T>
faz e você não pode armazenar duplicados (adicionar um duplicado não tem efeito, essa é a parte 'Definir').Um exemplo de quando usar a
Hashset<T>
seria se você deseja descobrir se uma palavra reproduzida em um jogo de Scrabble é uma palavra válida em inglês (ou outro idioma). Melhor ainda seria se você quisesse criar um serviço da Web para ser usado por todas as instâncias de uma versão online desse jogo.A
List<T>
seria uma boa estrutura de dados para criar o placar para rastrear as pontuações dos jogadores.fonte
Lista é uma lista ordenada. Isto é
HashSet é um conjunto. Isto:
A lista é mais apropriada quando você deseja acessar sua coleção como se fosse uma matriz à qual você pudesse anexar, inserir e remover itens. O HashSet é uma opção melhor se você deseja tratar sua coleção como uma "bolsa" de itens em que a ordem não é importante ou quando você deseja compará-la com outros conjuntos usando as operações como IntersectWith ou UnionWith.
fonte
A lista não é necessariamente única, enquanto o hashset é, por exemplo.
fonte
Uma Lista é uma coleção ordenada de objetos do Tipo T que, diferente de uma matriz, você pode adicionar e remover entradas.
Você usaria uma lista na qual deseja referenciar os membros na ordem em que os armazenou e os está acessando por uma posição e não pelo item em si.
Um HashSet é como um dicionário em que o item em si é a chave e o valor, a ordem não é garantida.
Você usaria um HashSet no qual deseja verificar se um objeto está na coleção
fonte
List
mantém uma ordem (ou seja, quando as coisas foram adicionadas), mas não classifica automaticamente os itens. Você teria que ligar.Sort
ou usar aSortedList
.Se você decidir aplicar essas estruturas de dados ao uso real no desenvolvimento orientado a dados, um HashSet será MUITO útil no teste de replicação em fontes do adaptador de dados, para limpeza e migração de dados.
Além disso, se você usar a Classe DataAnnotations, poderá implementar a lógica Key nas propriedades da classe e controlar efetivamente um Índice Natural (clusterizado ou não) com um HashSet, onde isso seria muito difícil na implementação da Lista.
Uma opção forte para usar uma lista é implementar genéricos para várias mídias em um View Model, como enviar uma lista de classes para um MVC View para um DropDownList Helper e também para enviar como uma construção JSON via WebApi. A lista permite lógica típica de coleção de classes e mantém a flexibilidade para uma abordagem mais semelhante à "Interface" para calcular um modelo de visualização único para diferentes mídias.
fonte