¡La respuesta aceptada a esta pregunta NO responde válidamente a la pregunta! Da la respuesta correcta, pero esa respuesta no se muestra en la evidencia que proporcionaron.
Lo que muestra esa respuesta es que las búsquedas clave en un Dictionary
o HashSet
son mucho más rápidas que buscar en un List
. Lo cual es cierto, pero no interesante, ni sorprendente, ni prueba de que tengan el mismo velocidad.
Ejecuté el siguiente código para comparar los tiempos de búsqueda y mi conclusión es que, de hecho, SON a la misma velocidad. (O al menos, si hay alguna diferencia, entonces la diferencia está dentro de la desviación estándar de esa velocidad)
Específicamente, 100.000.000 de búsquedas tardaron entre 10 y 11,5 segundos para ambos, para mí, en esta prueba.
Código de prueba:
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");
}
}