C#  - Comparando List com Dictionary


Hoje vamos comparar List com Dictionary na linguagem C#.

As listas e os dicionários pertencem às coleções de genéricas, usadas para armazenar coleções de dados.

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:

  • List  - Permite a ordem persistente dos itens, um Dictionary não permite;
  • List  - Permite acesso rápido por índice;
  • List  - Dá suporte incorporado no algoritmo QuickSort para classificação rápida de dados;

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:


José Carlos Macoratti