La réponse acceptée à cette question ne répond PAS valablement à la question ! Elle donne la bonne réponse, mais cette réponse n'est pas démontrée par les preuves fournies.
Ce que cette réponse montre, c'est que les recherches de clés sur une Dictionary
o HashSet
sont beaucoup plus rapides que de chercher dans une List
. Ce qui est vrai, mais n'est ni intéressant, ni surprenant, ni la preuve qu'ils ont la capacité d'agir. même vitesse.
J'ai exécuté le code ci-dessous pour comparer les temps de recherche, et ma conclusion est qu'ils sont en fait de la même vitesse. (Ou du moins, s'il y a une différence, alors la différence est bien dans l'écart type de cette vitesse).
Plus précisément, 100 000 000 de recherches prenaient entre 10 et 11,5 secondes pour les deux, pour moi, dans ce test.
Code de test :
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");
}
}
2 votes
Étape 1 : Voir si les deux font la même chose (dans ce cas, les deux collections ont des objectifs différents). Étape 2 : Consultez la documentation et voyez si vous vous sentez bien dans leur complexité asymptotique. Étape 3 : Si vous sentez que vous devez vous inquiéter davantage, mesurez-vous et posez ensuite la question en affichant le repère qui va avec. Dans votre cas, la question devient inutile dès la première étape.