Jawaban yang diterima untuk pertanyaan ini TIDAK menjawab pertanyaan secara valid! Itu kebetulan memberikan jawaban yang benar, tetapi jawaban itu tidak ditunjukkan oleh bukti yang mereka berikan.
Apa yang ditunjukkan oleh jawaban itu adalah bahwa pencarian kunci di a Dictionary
atau HashSet
jauh lebih cepat daripada mencari di a List
. Yang benar, tapi tidak menarik, tidak mengherankan, atau bukti bahwa mereka memiliki kecepatan yang sama .
Saya telah menjalankan kode di bawah ini untuk membandingkan waktu pencarian, dan kesimpulan saya adalah bahwa sebenarnya kecepatannya sama. (Atau setidaknya, jika ada perbedaan, maka perbedaan tersebut berada dalam Standar Deviasi kecepatan tersebut)
Secara khusus, 100.000.000 pencarian membutuhkan waktu antara 10 dan 11,5 detik untuk keduanya, bagi saya, dalam pengujian ini.
Kode Tes:
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");
}
}