Estou tentando entender quais estruturas de dados são as mais eficientes e quando / onde usar quais.
Agora, pode ser que eu simplesmente não entenda bem as estruturas, mas como é ILookup(of key, ...)
diferente de uma Dictionary(of key, list(of ...))
?
Também onde eu gostaria de usar ILookup
e onde seria mais eficiente em termos de velocidade do programa / memória / acesso a dados, etc?
Respostas:
Duas diferenças significativas:
Lookup
é imutável. Yay :) (pelo menos, acredito que aLookup
classe concreta é imutável e aILookup
interface não fornece nenhum membro mutante. Poderia haver outras implementações mutáveis, é claro.)KeyNotFoundException
. (Portanto, não háTryGetValue
, AFAICR.)É provável que sejam equivalentes em eficiência - a pesquisa pode muito bem usar
Dictionary<TKey, GroupingImplementation<TValue>>
os bastidores, por exemplo. Escolha entre eles com base em seus requisitos. Pessoalmente, acho que a pesquisa geralmente se encaixa melhor que aDictionary<TKey, List<TValue>>
, principalmente devido aos dois primeiros pontos acima.Note-se que como um detalhe de implementação, a implementação concreta de
IGrouping<,>
que é usado para os valores de instrumentosIList<TValue>
, o que significa que é eficaz para utilizar comCount()
,ElementAt()
etc.fonte
Interessante que ninguém tenha declarado a maior diferença real (extraído diretamente do MSDN ):
fonte
Tanto a
Dictionary<Key, List<Value>>
como aLookup<Key, Value>
logicamente podem conter dados organizados de maneira semelhante e ambos têm a mesma ordem de eficiência. A principal diferença é queLookup
é imutável: ele não possuiAdd()
métodos e construtor público (e, como Jon mencionou, você pode consultar uma chave inexistente sem uma exceção e ter a chave como parte do agrupamento).Quanto a qual você usa, isso realmente depende de como você deseja usá-las. Se você estiver mantendo um mapa da chave para vários valores que estão sendo constantemente modificados, então a
Dictionary<Key, List<Value>>
provavelmente será melhor, pois é mutável.Se, no entanto, você tiver uma sequência de dados e desejar apenas uma visualização somente leitura dos dados organizados por chave, uma pesquisa será muito fácil de construir e fornecerá um instantâneo somente leitura.
fonte
A principal diferença entre an
ILookup<K,V>
e aDictionary<K, List<V>>
é que um dicionário é mutável; você pode adicionar ou remover chaves e também adicionar ou remover itens da lista pesquisada. UmILookup
é imutável e não pode ser modificado depois de criado.A implementação subjacente de ambos os mecanismos será igual ou semelhante, portanto, a velocidade de pesquisa e a pegada de memória serão aproximadamente as mesmas.
fonte
Outra diferença ainda não mencionada é que Lookup () suporta chaves nulas :
fonte
Quando a exceção não é uma opção, vá para Pesquisa
Se você está tentando obter uma estrutura tão eficiente quanto uma,
Dictionary
mas não sabe ao certo que não há chave duplicada na entrada,Lookup
é mais seguro.Como mencionado em outra resposta, ele também suporta chaves nulas e retorna sempre um resultado válido quando consultado com dados arbitrários; portanto, ele parece mais resiliente a entradas desconhecidas (menos propenso que o Dictionary a gerar exceções).
E é especialmente verdade se você comparar com a
System.Linq.Enumerable.ToDictionary
função:A alternativa seria escrever seu próprio código de gerenciamento de chaves duplicado dentro de um
foreach
loop.Considerações sobre desempenho, Dicionário: um vencedor claro
Se você não precisar de uma lista e gerenciar um grande número de itens,
Dictionary
(ou mesmo sua própria estrutura personalizada) seria mais eficiente:Como
Lookup
é necessário manter uma lista de itens para cada chave, é mais lento que o Dicionário (cerca de 3x mais lento para um grande número de itens)fonte