| 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
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"));
}
}
Se você for usar objetos, não esqueça de re-implementar o método Equals.
ResponderExcluir