Câu trả lời được chấp nhận cho câu hỏi này KHÔNG trả lời hợp lệ câu hỏi! Tình cờ đưa ra câu trả lời chính xác, nhưng câu trả lời đó không được hiển thị bằng bằng chứng họ cung cấp.
Câu trả lời đó cho thấy rằng việc tra cứu Key trên a Dictionary
hoặc HashSet
nhanh hơn rất nhiều so với tra cứu trong a List
. Điều đó đúng, nhưng không thú vị, cũng không ngạc nhiên, cũng không bằng chứng rằng chúng có cùng tốc độ.
Tôi đã chạy đoạn mã bên dưới để so sánh thời gian tra cứu và kết luận của tôi là chúng trên thực tế có cùng tốc độ. (Hoặc ít nhất, nếu có bất kỳ sự khác biệt nào, thì sự khác biệt đó nằm trong Độ lệch Chuẩn của tốc độ đó)
Cụ thể, 100.000.000 lần tra cứu mất từ 10 đến 11,5 giây cho cả hai, đối với tôi, trong thử nghiệm này.
Mã kiểm tra:
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");
}
}