J'essaie de comprendre quelles structures de données sont les plus efficaces et quand / où utiliser lesquelles.
Maintenant, il se peut que je ne comprends tout simplement pas assez bien les structures, mais en quoi est-ce ILookup(of key, ...)
différent d'un Dictionary(of key, list(of ...))
?
Aussi où voudrais-je utiliser un ILookup
et où serait-il plus efficace en termes de vitesse du programme / mémoire / accès aux données, etc.?
Réponses:
Deux différences significatives:
Lookup
est immuable. Yay :) (Au moins, je crois que laLookup
classe concrète est immuable, et l'ILookup
interface ne fournit aucun membre en mutation. Il pourrait y avoir d'autres implémentations mutables, bien sûr.)KeyNotFoundException
. (Par conséquent, il n'y a pasTryGetValue
, AFAICR.)Ils sont susceptibles d'être équivalents en efficacité - la recherche peut très bien utiliser
Dictionary<TKey, GroupingImplementation<TValue>>
les coulisses, par exemple. Choisissez entre eux en fonction de vos besoins. Personnellement, je trouve que la recherche est généralement un meilleur ajustement que aDictionary<TKey, List<TValue>>
, principalement en raison des deux premiers points ci-dessus.Notez qu'en tant que détail d'implémentation, l'implémentation concrète
IGrouping<,>
est utilisée pour les implémentations de valeursIList<TValue>
, ce qui signifie qu'il est efficace à utiliser avecCount()
,ElementAt()
etc.la source
Intéressant que personne n'ait mentionné la plus grande différence réelle (prise directement de MSDN ):
la source
A
Dictionary<Key, List<Value>>
et aLookup<Key, Value>
logiquement peuvent contenir des données organisées de manière similaire et les deux sont du même ordre d'efficacité. La principale différence est queLookup
c'est immuable: il n'a pas deAdd()
méthodes et pas de constructeur public (et comme Jon l'a mentionné, vous pouvez interroger une clé inexistante sans exception et avoir la clé dans le cadre du regroupement).Quant à savoir lequel utilisez-vous, cela dépend vraiment de la façon dont vous souhaitez les utiliser. Si vous maintenez une carte de clés vers plusieurs valeurs qui est constamment modifiée, alors a
Dictionary<Key, List<Value>>
est probablement mieux car il est mutable.Si, cependant, vous avez une séquence de données et que vous voulez juste une vue en lecture seule des données organisées par clé, une recherche est très facile à construire et vous donnera un instantané en lecture seule.
la source
La principale différence entre un
ILookup<K,V>
et unDictionary<K, List<V>>
est qu'un dictionnaire est modifiable; vous pouvez ajouter ou supprimer des clés, et également ajouter ou supprimer des éléments de la liste recherchée. UnILookup
est immuable et ne peut pas être modifié une fois créé.L'implémentation sous-jacente des deux mécanismes sera identique ou similaire, de sorte que leur vitesse de recherche et leur empreinte mémoire seront approximativement les mêmes.
la source
Une autre différence non encore mentionnée est que Lookup () prend en charge les clés nulles :
la source
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: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: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)la source