A resposta aceita para esta pergunta NÃO responde validamente à pergunta! Acontece que dá a resposta correta, mas essa resposta não é mostrada pelas evidências que eles forneceram.
O que essa resposta mostra é que as pesquisas de chave em a Dictionary
ou HashSet
são muito mais rápidas do que pesquisar em a List
. O que é verdade, mas não é interessante, nem surpreendente, nem prova de que eles têm a mesma velocidade.
Executei o código abaixo para comparar os tempos de pesquisa e minha conclusão é que eles SÃO, de fato, a mesma velocidade. (Ou pelo menos, se houver alguma diferença, então a diferença está bem dentro do Desvio Padrão dessa velocidade)
Especificamente, 100 milhões de pesquisas estavam levando entre 10 e 11,5 segundos para ambos, para mim, neste teste.
Código de teste:
private const int TestReps = 100_000_000;
[Test]
public void CompareHashSetContainsVersusDictionaryContainsKey()
{
for (int j = 0; j < 10; j++)
{
var rand = new Random();
var dict = new Dictionary<int, int>();
var hash = new HashSet<int>();
for (int i = 0; i < TestReps; i++)
{
var key = rand.Next();
var value = rand.Next();
hash.Add(key);
dict.TryAdd(key, value);
}
var testPoints = Enumerable.Repeat(1, TestReps).Select(_ => rand.Next()).ToArray();
var timer = new Stopwatch();
var total = 0;
timer.Restart();
for (int i = 0; i < TestReps; i++)
{
var newKey = testPoints[i];
if (hash.Contains(newKey))
{
total++;
}
}
Console.WriteLine(timer.Elapsed);
var target = total;
Assert.That(total == target);
timer.Restart();
for (int i = 0; i < TestReps; i++)
{
var newKey = testPoints[i];
if (dict.ContainsKey(newKey))
{
total++;
}
}
Console.WriteLine(timer.Elapsed);
Assert.That(total == target * 2);
Console.WriteLine("Set");
}
}