ILookup interface vs IDictionary
Comment le ILookup<key, value>
interface diffèrent de IDictionary<key, value>
?
Je ne comprends pas ce que la ILookup
interface est destinée.
- "Multi" plan de soutien est la première chose qui vient à l'esprit (une clé peut correspondre à un ensemble de valeurs).
- Double Possible de "Quel est le point de Recherche de<TKey, TElement>?".
Vous devez vous connecter pour publier un commentaire.
ILookup
entrées peuvent contenir plusieurs éléments par clé - chaque clé est associé à unIEnumerable<TElement>
.Aussi comme évoqué dans les commentaires d'un
ILookup
est immuable, tandis que vous pouvez mettre à jour les valeurs dans unIDictionary
(il expose uneAdd()
méthode et un indexeur qui permet d'avoir et les valeurs de réglage).En résumé leurs cas d'utilisation est très différente - vous utiliser une recherche lorsque vous avez besoin d'un 1:N carte avec des valeurs qui sont fixes et ne va pas (et ne peut pas) changer. Un dictionnaire sur l'offre d'autre part une mutable mappage 1:1 de paires clé-valeur, de sorte qu'il peut être mis à jour pour ajouter ou supprimer des valeurs.
IEnumerable<T>
au lieu d'unT
.ILookup<TElement>
n'est pas une garantie de l'immuabilité. Votre réponse semble impliquer que c'est. Il fournit simplement à un readonly vue d'une recherche. Comment, par ailleurs, une méthode qui accepte unILookup<TElement>
peut gérer la recherche de contenu qui change, c'est jusqu'à cette méthode, et si il n'y a pas de documentation, il est plus sûr d'éviter la mutation d'une recherche alors que les étrangers, le code est toujours en référencement et en fonction de votre cas d'utilisation. Voir toute la discussion sur la façon dont les gens pensent, à tort, que la mise en œuvreIReadOnlyList<T>
devrait impliquer une liste est immuable.ILookup<TKey, TElement>
c'est une mauvaise idée si vous prévoyez de les transformer. Si il n'y a pas de docs, vous devriez être en mesure de supposer que celle-ci respecte son interface. Bien sûr, la vraie vie est en désordre, mais si vous créez une recherche avec l'un desToLookup
méthodes d'extension, il doit être sûr de supposer qu'il ne sera pas modifié. Il ya des façons dont vous pouvez, mais les consommateurs de votreILookup<TKey, TElement>
tapé les membres doivent suivre le principe de moindre surprise. Si vous trouvez que vous avez été passée un qui se transforme en une observable façon,throw
.IReadOnlyDictionary
ouILookup
. Je suis juste essayer de faire la distinction entre “lecture seule” et “immuable”. Je tiens également à noter que, avecIDictionary<TKey, TValue>.IsReadOnly
existantIDictionary
n'est pas nécessairement mutable ;-). Désolé pour le trop pédant critique xDIl est beaucoup plus simple que
IDictionary
. Il est utilisé par Linq. Il a seulementContains
,Item
etCount
.IDictionary
aAdd
,Remove
, etc.IReadOnlyDictionary<TKey, TValue>
et toutes les instances de laDictionary<TKey, TValue>
classe le mettre en œuvre (ToDictionary
retourne l'instance de la classe, de sorte qu'il fonctionne aussi), de sorte que vous pouvez exposer le dictionnaire en lecture seule.