Linq .Une VS .Existe - Quelle est la différence?
À l'aide de Linq sur les collections, quelle est la différence entre les lignes de code suivantes?
if(!coll.Any(i => i.Value))
et
if(!coll.Exists(i => i.Value))
Mise à jour de 1
Quand j'ai démonter .Exists
il semble comme il n'y a pas de code.
Mise à jour 2
Ce que quelqu'un sait pourquoi il n'y a pas de code pour ce que c'est?
- Comment fonctionne le code compilé ressemble? Comment avez-vous démonter? ildasm? Qu'avez-vous vous attendez à trouver, mais n'a pas?
Vous devez vous connecter pour publier un commentaire.
Voir la documentation
Liste.Existe (Méthode de l'objet - MSDN)
Cela existe depuis .NET 2.0, donc avant de LINQ. Destiné à être utilisé avec le Prédicat délégué, mais les expressions lambda sont rétro-compatibles. Aussi, juste la Liste a (pas même de IList)
IEnumerable.Tout (Méthode d'Extension - MSDN)
Ce qui est nouveau dans .NET 3.5 et utilise la touche Func(TSource, bool) comme argument, c'était donc destiné à être utilisé avec les expressions lambda et LINQ.
Dans le comportement, elles sont identiques.
List<>
des méthodes d'instance.La différence, c'est que Tout est une méthode d'extension pour toute
IEnumerable<T>
défini sur le Système.Linq.Énumérable. Il peut être utilisé sur n'importe quelIEnumerable<T>
instance.Existe ne semble pas être une méthode d'extension. Ma conjecture est que le col est de type
List<T>
. Si donc il Existe, est une méthode d'instance qui fonctionne très similaire à Tout.En bref, les méthodes sont essentiellement les mêmes. L'une est plus générale que les autres.
TLDR; de Performance
Any
semble plus lente (si j'ai le configurer correctement pour évaluer à la fois les valeurs à presque en même temps)test de générateur de liste:
Avec 10M enregistrements
Avec 5M enregistrements
Avec 1M enregistrements
Avec 500k, (j'ai aussi retournée autour de l'ordre dans lequel ils ont été évalués pour voir si il n'y a aucune opération supplémentaire associé avec n'importe quel exécuté en premier.)
Avec 100k enregistrements
Il semblerait
Any
à être plus lent par ordre de grandeur de 2.Edit: Pour 5 et 10M de disques que j'ai changé la façon dont il produit la liste et
Exists
soudainement devenu plus lent queAny
qui implique il ya quelque chose de mal dans la façon dont je suis en train de tester.Nouveau mécanisme de test:
Edit2: Ok, donc à éliminer toute influence de génération de données de test, j'ai écrit tout cela dans un fichier et maintenant le lire à partir de là.
10M
5M
1M
500k
Comme une continuation sur Matas réponse sur une analyse comparative.
TL/DR: Exists() et Tout() sont tout aussi rapides.
Tout d'abord: une analyse comparative à l'aide du Chronomètre n'est pas précise (voir series0ne sa réponse sur un autre, mais similaire, sujet), mais il est beaucoup plus précise que DateTime.
La façon d'obtenir vraiment des lectures précises en utilisant le Profilage des Performances. Mais une façon de se faire une idée de la façon dont les deux méthodes de mesure de la performance de l'une à l'autre est par l'exécution de deux méthodes charges de fois, puis de comparer le plus rapide en temps d'exécution de chaque. De cette façon, il n'a vraiment pas d'importance qui JITing et les autres bruits nous donne de mauvaises lectures (et il ne), parce que les deux exécutions sont "tout aussi trompeur" dans un sens.
Après l'exécution du code ci-dessus 4 fois (ce qui ne 1 000
Exists()
etAny()
sur une liste avec les 1 000 000 éléments), il n'est pas difficile de voir que les méthodes sont à peu près aussi rapide.Il est une légère différence, mais c'est trop petit un écart pour ne pas être expliqué par le bruit de fond. Je dirais que, si on le ferait 10 000 ou 100 000
Exists()
etAny()
au lieu de cela, que la légère différence disparaissent plus ou moins.Random r = new Random();
vraiment doit être tirée de cettefor
boucle.En outre, cela ne fonctionnera que si la Valeur est de type bool. Normalement, il est utilisé avec des prédicats. Tout prédicat serait généralement utilisé rechercher s'il existe un élément de satisfaire à une condition donnée. Ici, vous êtes en train de faire une carte à partir de votre élément de i à une valeur bool propriété. Il sera à la recherche d'un "je" dont la Valeur de la propriété est vraie. Une fois cela fait, la méthode renvoie true.
Lorsque vous corrigez les mesures - comme mentionné ci-dessus: Tout et n'Existe, et l'ajout de la moyenne -, nous allons obtenir la sortie suivante: