76 votes

Je regarde <TKey, TVal> vs groupage <TKey, TVal>

J'ai eu du mal à articuler les différences entre ILookup<TKey, TVal> et IGrouping<TKey, TVal>, et je suis curieux de savoir si je comprends bien maintenant. LINQ aggravé le problème en produisant des séquences d' IGrouping d'articles tout en me donnant également un ToLookup méthode d'extension. Donc, c'était comme s'ils étaient les mêmes jusqu'à ce que j'ai regardé de plus près.

var q1 = 
    from n in N
    group n by n.MyKey into g
    select g;
// q1 is IEnumerable<IGrouping<TKey, TVal>>

Ce qui est équivalent à:

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>

Suis-je la corriger dans la suite des analogies?

  1. Un IGrouping<TKey, TVal> est un groupe unique (c'est à dire un incrustée de séquence), analogue à l' KeyValuePair<TKey, TVal> où la valeur est en fait une séquence d'éléments (plutôt qu'un seul élément)
  2. Un IEnumerable<IGrouping<TKey, TVal>> est une séquence de ceux (similaire à ce que vous obtenez lors de l'itération sur un IDictionary<TKey, TVal>
  3. Un ILookup<TKey, TVal> est plus de l' IDictionary<TKey, TVal> où la valeur est en fait une séquence d'éléments

76voto

Jon Skeet Points 692016

Oui, tous ceux qui sont corrects.

Et ILookup<TKey, TValue> s'étend également IEnumerable<IGrouping<TKey, TValue>> de sorte que vous pouvez parcourir toutes les clés/collection les paires ainsi que la (ou à la place) de simplement rechercher des touches particulières.

En gros, je pense que d' ILookup<TKey,TValue> comme IDictionary<TKey, IEnumerable<TValue>>.

Gardez à l'esprit qu' ToLookup est un "do it now" exploitation (exécution immédiate), alors qu'un GroupBy est reporté. Comme il arrive, avec la façon dont les "pull LINQ" œuvres", lorsque vous commencez à tirer IGroupings à partir du résultat d'un GroupBy, il y a qu'à lire toutes les données de toute façon (parce que vous ne pouvez pas changer de groupe à mi-chemin par le biais de), tandis que dans d'autres implémentations, il peut être capable de produire un flux de résultat. (Il n'en Push LINQ; je m'attends à LINQ to Événements est le même.)

8voto

Il y a une autre différence importante entre ILookup et IDictionary: l'ancienne applique immutabilité dans le sens où ici pas de méthodes pour modifier les données (sauf lorsque le consommateur effectue un cast explicite). En revanche, IDictionary a des méthodes comme "Ajouter" qui permettent de changer les données. Donc, du point de vue de la fonctionnelle de la programmation et/ou de la programmation parallèle, ILookup est plus agréable. (Je ne souhaite qu'il y avait aussi une version de ILookup qui n'affecte qu'une valeur à une clé plutôt que d'un groupe.)

(Btw., il semble intéressant de souligner que la relation entre IEnumerable et IList est assez semblable à celle entre ILookup et IDictionary - le premier est immuable, le second ne l'est pas.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X