![]() |
Hoje vamos comparar List com Dictionary na linguagem C#. |
Assim Dictionary<TKey,TValue> e List<T> são semelhantes, ambos possuem estruturas de dados com acesso aleatório na plataforma .NET.
O Dictionary esta baseado em uma tabela de hash, o que significa que ele usa uma pesquisa de hash, que é um algoritmo eficiente para procurar coisas.
Por outro lado, em uma lista, é necessário ir e verificar elemento por elemento até encontrar o resultado desde o início.
Ao comparar com a estrutura de dados da List, um Dictionary tem quase sempre um tempo de pesquisa mais ou menos fixo. Um dicionário usa o algoritmo de hash para procurar o elemento (dados), e primeiro calcula um valor de hash para a chave e esse valor de hash leva ao intervalo de dados de destino.
Depois disso, cada elemento nos dados precisa ser verificado quanto à igualdade. Mas, na verdade, a lista será mais rápida que o dicionário na primeira pesquisa de itens, porque não há nada para pesquisar na primeira etapa.
Mas, na segunda etapa, a lista precisa examinar o primeiro item e depois o segundo item. Portanto, cada etapa da pesquisa leva cada vez mais tempo. Quanto maior a lista, mais tempo leva.
Assim, o
Dicionário, em
princípio, tem uma pesquisa mais rápida com O(1), enquanto o desempenho da
pesquisa de uma Lista é uma operação O(n).
Um Dictionary mapeia uma chave para um valor e
não pode ter chaves duplicadas, enquanto uma lista contém apenas uma
coleção de valores. Além disso, as listas permitem itens duplicados e
oferecem suporte à passagem linear.
Vejamos como definir, incluir itens e listar os dados de um
Dictionary:
Dictionary<string, int> dicionario = new Dictionary<string, int>();
dicionario.Add("primeiro", 1);
dicionario.Add("segundo", 2);
foreach (KeyValuePair<string, int> items in dicionario)
{
Console.WriteLine(items.Key.ToString() + " - " + items.Value.ToString());
}
|
Ao
adicionar dados a um dicionário, você deve especificar uma
chave exclusiva
para os dados, para que possam ser identificados exclusivamente.
Um dicionário tem um identificador exclusivo; portanto, sempre que você
procurar um valor em um dicionário, o tempo de execução deve calcular um
código de hash da chave.
Agora vejamos como definir, incluir itens e listar os dados de uma List:
List<int> lista = new List<int>(); lista.Add(10); lista.Add(20); lista.Add(30); lista.Add(40); foreach (int n in lista) { Console.WriteLine(n); } |
Em uma lista simplesmente adicionamos o item ao final do último item existente na lista.
Então qual seria melhor ?
Depende !!!!
Um
dicionário é muito útil quando você tem um conjunto de objetos complexos e
deseja ter acesso rápido, digamos ObjectName/ObjectId;
nesse caso, você cria um IDictionary<string,TObject>
onde a chave seria ObjectId e
Value seria o próprio objeto.
Algumas diferenças básicas:
Para pesquisas, um Dictionary em geral é uma escolha melhor. O tempo necessário é plano, uma complexidade de tempo constante O(1). Nas listas temos uma complexidade de tempo linear O(n).
Assim temos que:
List | Dictionary |
Aluno.Curso = cursos.Single(x=> x.AlunoId == aluno.Id).Value | aluno.Curso = dic[aluno.Id] |
Têm que enumerar a Lista até encontrar a entrada na Lista que possui o Id do aluno correto.O(n) | Para encontrar um certo elemento pela chave em um dicionário, é mais rápido, ele vai direto o elemento. O(1) |
E estamos conversados...
"Ai dos que
ajuntam casa a casa, reúnem campo a campo, até que não haja mais lugar, e
fiquem como únicos moradores no meio da terra!"
Isaías 5:8
Referências:
Visual Studio - Dica de produtividade - Quick Launch - Macoratti.net
Visual Studio - Dica de produtividade - Nuget - Macoratti.net
C# - Usando Listas com elegância - Macoratti
C# - Trabalhando com Coleções Genéricas do tipo List(<T>)
C# - Diferentes maneira de criar uma lista de objetos - Macoratti
C# - Acessando dados de um dicionário ordenado - Macoratti
C# - Usando um Dicionário para armazenar e ... - Macoratti
C# - Escolhendo a coleção correta para sua ... - Macoratti