Прийнята відповідь на це запитання НЕ коректно відповідає на запитання! Це трапляється, щоб дати правильну відповідь, але ця відповідь не відображається в наданих ними доказах.
Відповідь показує, що пошук ключів на a Dictionary
або HashSet
набагато швидший, ніж пошук в a List
. Що правда, але не цікаво, ні дивно, ні доказ того, що вони однакові швидкість.
Я запустив код нижче, щоб порівняти часи пошуку, і я можу зробити висновок, що вони справді однакові. (Або принаймні, якщо є якась різниця, то різниця знаходиться в межах стандартного відхилення цієї швидкості)
Зокрема, для цього тесту 100 000 000 пошукових записів займали від 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");
}
}