Lorsque l'exception n'est pas une option, optez pour la recherche
Si vous essayez d'obtenir une structure aussi efficace que a Dictionary
mais que vous ne savez pas avec certitude qu'il n'y a pas de clé en double en entrée,Lookup
c'est plus sûr.
Comme mentionné dans une autre réponse, il prend également en charge les clés nulles et renvoie toujours un résultat valide lorsqu'il est interrogé avec des données arbitraires, de sorte qu'il semble plus résilient aux entrées inconnues (moins enclin que Dictionary à déclencher des exceptions).
Et c'est particulièrement vrai si vous le comparez à la System.Linq.Enumerable.ToDictionary
fonction:
// won't throw
new[] { 1, 1 }.ToLookup(x => x);
// System.ArgumentException: An item with the same key has already been added.
new[] { 1, 1 }.ToDictionary(x => x);
L'alternative serait d'écrire votre propre code de gestion de clé en double à l'intérieur d'une foreach
boucle.
Considérations de performance, dictionnaire: un gagnant clair
Si vous n'avez pas besoin d'une liste et que vous allez gérer un grand nombre d'éléments Dictionary
(ou même votre propre structure personnalisée), ce serait plus efficace:
Stopwatch stopwatch = new Stopwatch();
var list = new List<string>();
for (int i = 0; i < 5000000; ++i)
{
list.Add(i.ToString());
}
stopwatch.Start();
var lookup = list.ToLookup(x => x);
stopwatch.Stop();
Console.WriteLine("Creation: " + stopwatch.Elapsed);
// ... Same but for ToDictionary
var lookup = list.ToDictionary(x => x);
// ...
Comme Lookup
il faut maintenir une liste d'éléments pour chaque clé, il est plus lent que Dictionary (environ 3 fois plus lent pour un grand nombre d'éléments)
Vitesse de recherche: Création: 00: 00: 01.5760444
Vitesse du dictionnaire: Création: 00: 00: 00.4418833