100 votes

Pourquoi ToLookup et GroupBy sont-ils différents?

.ToLookup<TSource, TKey> renvoie un ILookup<TKey, TSource>. ILookup<TKey, TSource> implémente l'interface IEnumerable<IGrouping<TKey, TSource>>.

.GroupBy<TSource, TKey> renvoie un IEnumerable<IGroupking<Tkey, TSource>>.

ILookup a la pratique de l'indexeur de la propriété, de sorte qu'il peut être utilisé dans un dictionnaire (ou de recherche) qu'manière, alors que le Groupe ne peut pas. GroupBy sans l'indexeur est une douleur à travailler avec, à peu près la seule façon vous pouvez alors faire référence au retour de l'objet est en bouclant sur elle (ou en utilisant un autre LINQ-méthode d'extension). En d'autres termes, tous les cas que le Groupe fonctionne, ToLookup fonctionnera aussi bien.

Tout cela me laisse avec la question de savoir pourquoi aurais-je jamais la peine avec GroupBy? Pourquoi devrait-il exister?

161voto

Eric Lippert Points 300275

pourquoi aurais-je jamais la peine avec GroupBy? Pourquoi devrait-il exister?

Ce qui se passe lorsque vous appelez ToLookup sur un objet représentant une base de données distante table avec un milliard de lignes?

Les milliards de lignes sont envoyés sur le fil, et de vous construire la table de recherche à l'échelle locale.

Ce qui se passe lorsque vous appelez GroupBy sur un tel objet?

Un objet de requête est construite; fin de l'histoire.

Lorsque cette requête objet est dénombrée à l'analyse de la table est fait sur le serveur de base de données et l'regroupés les résultats sont envoyés sur demande un peu à la fois.

Logiquement, ils sont la même chose, mais l' incidence sur les performances de chacun sont complètement différents. L'appel de ToLookup signifie je veux un cache de l'ensemble du droit de chose maintenant, organisées par le groupe. L'appel de Groupe signifie "je suis la construction d'un objet pour représenter la question" quels sont ces choses semblent comme si j'organisées par le groupe?""

86voto

sll Points 30638

En termes simples du monde LINQ:

  • ToLookup() - exécution immédiate
  • GroupBy() - exécution différée

15voto

Allon Guralnek Points 8545

Les deux sont similaires, mais sont utilisés dans des scénarios différents. .ToLookup() renvoie un prêt à l'usage de l'objet qui a déjà tous les groupes (mais pas le groupe de contenu) chargé avec impatience. D'autre part, .GroupBy() renvoie un paresseux chargé de la séquence de groupes.

Différents fournisseurs LINQ peuvent avoir des comportements différents pour les impatients et chargement différé des groupes. Avec LINQ-to-Objet il a probablement fait peu de différence, mais avec LINQ-to-SQL (ou LINQ-to-EF, etc.), l'opération de regroupement est effectué sur le serveur de base de données plutôt que sur le client, et donc vous pouvez faire un filtrage supplémentaire sur la clé de groupe (qui génère un HAVING clause) et seulement ensuite certains de ces groupes au lieu de tous. .ToLookup() ne serait pas permettre une telle sémantique, puisque tous les éléments sont regroupés avec impatience.

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