J'ai eu des difficultés à articuler les différences entre ILookup<TKey, TVal>
et IGrouping<TKey, TVal>
, et je suis curieux si je comprends bien maintenant. LINQ a aggravé le problème en produisant des séquences de IGrouping
articles tout en me donnant une méthode d'extension ToLookup
. Donc, il me semblait qu'ils étaient identiques jusqu'à ce que je regarde de plus près.ILookup <TKey, TVal> vs IGrouping <TKey, TVal>
var q1 =
from n in N
group n by n.MyKey into g
select g;
// q1 is IEnumerable<IGrouping<TKey, TVal>>
ce qui équivaut à:
var q2 = N.GroupBy(n => n.MyKey, n => n);
// q2 is IEnumerable<IGrouping<TKey, TVal>>
qui ressemble beaucoup:
var q3 = N.ToLookup(n => n.MyKey, n => n);
// q3 is ILookup<TKey, TVal>
Ai-je raison dans les analogies suivantes?
- Un
IGrouping<TKey, TVal>
est un seul groupe (par exemple une séquence à clé), analogue àKeyValuePair<TKey, TVal>
dont la valeur est en fait une séquence d'éléments (plutôt que d'un seul élément) - Un
IEnumerable<IGrouping<TKey, TVal>>
est une séquence de ceux (similaire à ce que vous obtenez lorsque vous parcourez unIDictionary<TKey, TVal>
- un
ILookup<TKey, TVal>
est plus comme unIDictionary<TKey, TVal>
où la valeur est en fait une suite d'éléments
Merci pour la réponse. Je n'ai jamais pensé à Linq en termes de push/pull avant. Quand je suis allé à Google, je suis tombé sur l'un de vos blogs, donc je vais vérifier cela. Cela semble être une façon intéressante d'y penser. – mckamey
Je pense toujours que ces différences ne justifient pas 2 interfaces différentes. Je pense que le concepteur de la bibliothèque aurait dû choisir une seule interface.Peut-être juste un goût personnel qui est ici quelque chose de pas assez explicite. – rudimenter
Est-ce moi ou y at-il une certaine confusion avec GroupBy vs GroupJoin? Ce ne sont que des liens conceptuels. Peut-être que c'est juste une faute de frappe dans la réponse si. – sehe