Принятый ответ на этот вопрос НЕ является правильным ответом на вопрос! Бывает, что даётся правильный ответ, но этот ответ не подтверждается предоставленными доказательствами.
Этот ответ показывает, что поиск ключей в Dictionary
или HashSet
намного быстрее, чем поиск в List
. Что верно, но не интересно, не удивительно и не доказывает, что у них одинаковая скорость.
Я запустил приведенный ниже код, чтобы сравнить время поиска, и пришел к выводу, что они действительно имеют одинаковую скорость. (Или, по крайней мере, если есть какая-то разница, то разница находится в пределах стандартного отклонения этой скорости)
В частности, для меня в этом тесте 100000000 поисков занимали от 10 до 11,5 секунд для обоих.
Код теста:
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");
}
}