Pourquoi ToLookup et Grouper différents?
.ToLookup<TSource, TKey>
retourne un ILookup<TKey, TSource>
. ILookup<TKey, TSource>
met également en œuvre l'interface IEnumerable<IGrouping<TKey, TSource>>
.
.GroupBy<TSource, TKey>
retourne un IEnumerable<IGrouping<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?
GroupBy
EstIQuerable
,ILookup
n'est pas- GroupBy ne pas énumérer la liste ToLookup énumère de la même façon ToList / ToArray
- J'ai nommé ce pour la réouverture de la question, c'est prétendument un double de est sur IGrouping plutôt que de les Grouper et de ILookup plutôt que ToLookup. Les différences entre ceux qui sont différents pour les différences entre ces. Cela devrait être évident que les différences dans les réponses entre les questions.
- deux d'entre eux de créer un
Lookup
, maisGroupBy
crée lorsque le résultat est énuméré referencesource.microsoft.com/#System.Core/System/Linq/...
Vous devez vous connecter pour publier un commentaire.
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.
Lors que l'objet de requête est dénombrée à l'analyse de la table est fait sur le serveur de base de données et les groupes de résultats sont renvoyés sur demande un peu à la fois.
Logiquement ils sont la même chose, mais la les conséquences de performance 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?""
IQueryable<T>
représentation. Votre réponse couvre cette situation, mais quand c'est juste de la plaine olIEnumerable<T>
(LINQ-to-Objets), il peut sembler comme il n'y a pas de raison d'utiliser l'un sur l'autre, qui est ce que je crois @Shlomo est d'essayer d'obtenir au. Pas leIQueryable<T>
cas, mais le LINQ-to-Objets de cas.Dans LINQ simple-monde, les mots:
ToLookup()
- exécution immédiateGroupBy()
- exécution différéeLes deux sont similaires, mais sont utilisés dans des scénarios différents.
.ToLookup()
retourne 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()
retourne 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()
de ne pas permettre une telle sémantique, puisque tous les éléments sont regroupés avec impatience.