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

Postagens mais visitadas deste blog

Lendo sobre o Mercado! Isso vai dar certo?

Economia? Todo mundo sabe que não sou um investidor de sucesso (basta ver que ainda não fiquei milionário), mas gosto de tentar entender como o mercado funciona. Faço analisando diversas opiniões publicadas em tablóides sobre o assunto (principalmente sobre o mercado de ações). E, se é assim, porque não escrever um pouco sobre isso? Com certeza vai manter as minhas noites ocupadas e espero proporcionar um pouco de feedback  sobre as minhas erradas opiniões... (não estou sendo modesto, na verdade digo erradas porque ainda não consegui acertar) Sem mais delongas... ... existe um novo artigo no site do InfoMoney intitulado "O que comprar e o que vender na bolsa em 2014, de acordo com gestor"   que apresenta opiniões acerca do que pode acontecer no mercado acionário no ano de 2014 pelo Mendes (Walter Mendes). Basicamente o autor defende que a economia vai se manter estagnada (crescendo míseros 2%), mas a inflação vai continuar alta. O que isto quer dizer? Os consumido...

Comunicação é a alma do negócio

Eu não sei se todo chefe sabe, mas em qualquer almoço em que mais de dois subordinados estejam reunidos sem que “o carrasco” esteja presente, ele será o assunto principal! Não importa se é bom ou ruim ou se é empenhado ou não, é irressistível não falar daquele que é responsável por nossa produtividade! Foi assim nos tempos de colégio, quando os nossos pais mandavam a gente estudar, foi assim na faculdade quando nossas namoradas ligavam a todo momento e é assim no dia-a-dia de trabalho. E o tema da conversa nem sempre é bom… Mas sabe o que todo chefe devia fazer? Ele devia achar ÓTIMO! É importantíssimo receber  feedbacks!  Infelizmente a quantidade de retornos que recebemos é inversamente proporcional ao cargo que desempenhamos. Se dizer para o chefe o quanto ele está se saindo bem já é difícil, imagina dizer que tudo o que ele faz é atrapalhar o andamento dos processos! Falar olhando para cima é muito mais complicado do que falar olhando para frente. E,  se ...

Ter um alvo onde colocar a mira é o segredo de todo início de projeto.

Imediatamente após nós, jovens empreendedores, identificarmos uma “necessidade de sucesso”, sofremos uma súbita onda de empolgação! A descoberta esta tão fresca na cabeça que começamos a bolar milhões de planos sobre como o produto ou o serviço poderia ser. Surge uma vontade imensa de compartilhar com outras pessoas a possibilidade de negócio. Realmente acreditamos que a idéia pode ser uma excelente oportunidade (e na maioria das vezes ela o é)! Esta é a melhor fase, mas infelizmente também é a mais perigosa por três motivos: 1º Para começar porque a maioria das pessoas com quem você comentará não esta preparada para trilhar caminhos fora de uma zona de conforto. Elas vão comentar sobre o trabalho despendido e que já existem dezenas de produtos iguais no mercado, que você será só mais um etc… Mas você já pensou no mundo sem o Google? Um produto nada inovador que hoje representa um império de 100 bilhões de dólares… E o facebook? Outra empresa bilionária. 2º Por ca...