Pular para o conteúdo principal

List sem repetição/duplicação? Use HASHSET!



Resultado da listagem

Tem diferença! :)

Mas como chegamos nisto?

1. Preparando listas para comparação

Foram três. Todas com 32.767 registos.

Uma totalmente sem repetições e com números sequenciais.

Uma com poucas repetições (garantidas com números randômicos variando entre 1 e  32.767 / 2 :) e

Uma com muitas repetições (também randômicos, entre 1 e 32.767 / 5)

2. Percorrendo e populando as novas listas 

Como a classe List não implementa validação de repetição, optamos por escolher o método mais usado (e aconselhável, principalmente onde trabalho :) que é o método Contains.
if (!list.Contains(listaSemRepeticao[i]))                    list.Add(listaSemRepeticao[i]);
 E na HashSet, inserção direta (porque ela já implementa a verificação de repetição).
hash.Add(listaSemRepeticao[i]);
E só!

3. Visualizando os resultados.

Presentes na imagem acima.

4. Curiosidades

Interessante notar que, maior número de repetições, melhor o desempenho para a List (apesar de continuar perdendo para a HashSet). A amostra de verificação tende a ficar menor (uma vez que não inserimos registros duplicados na listagem).

Menos registros, menos à percorrer com o Contains.

5. Nossa conclusão

Aprenda a usar o que você tem em mãos. Sempre pesquise a melhor ferramenta. Seu cliente aprecia.

Nosso código "porco"? (relaxem, tudo foi escrito em 15 minutos :)

class Program
    {
        static int tamanhoLista = short.MaxValue;
 
        static void Main(string[] args)
        {
            var listaSemRepeticao = new int[tamanhoLista];
            var listaComPoucaRepeticao = new int[tamanhoLista];
            var listaComMuitaRepeticao = new int[tamanhoLista];
            var random = new Random();
            Console.WriteLine("Tamanho das listas: " + tamanhoLista.ToString());
            for (int i = 0; i < tamanhoLista; i++)
            {
                listaSemRepeticao[i] = i + 1;
                listaComPoucaRepeticao[i] = random.Next(1, tamanhoLista / 2);
                listaComMuitaRepeticao[i] = random.Next(1, tamanhoLista / 5);
            }
         
            /* Pouca repetição */
            InserindoRepeticoes(listaSemRepeticao, "Sem repetição");
            InserindoRepeticoes(listaComPoucaRepeticao, "Pouca repetição");
            InserindoRepeticoes(listaComMuitaRepeticao, "Muita repetição");
         
            Console.Read();
        }
 
        private static void InserindoRepeticoes(int[] lista, string titulo)
        {
            var listWatch = new Stopwatch();
            var hashWatch = new Stopwatch();
            var list = new List<int>();
            var hash = new HashSet<int>();
            for (int i = 0; i < tamanhoLista; i++)
            {
                listWatch.Start();
                if (!list.Contains(lista[i]))
                    list.Add(lista[i]);
                listWatch.Stop();
                hashWatch.Start();
                hash.Add(lista[i]);
                hashWatch.Stop();
            }
            Console.WriteLine(string.Concat("> ", titulo));
            Console.WriteLine(string.Concat("List ", listWatch.ElapsedMilliseconds, "ms - Total ", list.Count, " registros"));
            Console.WriteLine(string.Concat("Hash ", hashWatch.ElapsedMilliseconds, "ms - Total ", hash.Count, " registros"));
        }
    }

Comentários

  1. Se você for usar objetos, não esqueça de re-implementar o método Equals.

    ResponderExcluir

Postar um comentário