En utilisant LINQ sur des 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 1
Quand je démonte, .Exists
il semble qu'il n'y ait pas de code.
Update 2
Quelqu'un sait pourquoi il n'y a pas de code pour celui-ci?
c#
linq
collections
Anthony D
la source
la source
Réponses:
Voir documentation
List.Exists (méthode Object - MSDN)
Cela existe depuis .NET 2.0, donc avant LINQ. Destiné à être utilisé avec le délégué Predicate , mais les expressions lambda sont rétrocompatibles. Aussi, juste List a ceci (pas même IList)
IEnumerable.Any (méthode d'extension - MSDN)
Ceci est nouveau dans .NET 3.5 et utilise Func (TSource, bool) comme argument, il était donc destiné à être utilisé avec des expressions lambda et LINQ.
En comportement, ceux-ci sont identiques.
la source
List<>
méthodes d'instance .NET 2 .La différence est que Any est une méthode d'extension pour tout
IEnumerable<T>
défini sur System.Linq.Enumerable. Il peut être utilisé sur n'importe quelleIEnumerable<T>
instance.Exists ne semble pas être une méthode d'extension. Je suppose que coll est de type
List<T>
. Si c'est le cas, Exists est une méthode d'instance qui fonctionne de manière très similaire à Any.Bref , les méthodes sont essentiellement les mêmes. L'un est plus général que l'autre.
la source
TLDR; Les performances
Any
semblent être plus lentes (si j'ai bien configuré cela pour évaluer les deux valeurs presque en même temps)générateur de liste de tests:
Avec 10 millions d'enregistrements
Avec 5 millions d'enregistrements
Avec 1 million d'enregistrements
Avec 500k, (j'ai également inversé l'ordre dans lequel ils sont évalués pour voir s'il n'y a aucune opération supplémentaire associée à celle qui s'exécute en premier.)
Avec 100 000 enregistrements
Il semblerait
Any
qu'il soit plus lent d'une magnitude de 2.Edit: Pour les enregistrements de 5 et 10M, j'ai changé la façon dont il génère la liste et je suis
Exists
soudainement devenu plus lent queAny
je suis ce qui implique qu'il y a quelque chose de mal dans la façon dont je teste.Nouveau mécanisme de test:
Edit2: Ok donc pour éliminer toute influence de la génération de données de test, j'ai tout écrit dans un fichier et maintenant je le lis à partir de là.
10M
5M
1M
500k
la source
Dans la continuité de la réponse de Matas sur l'analyse comparative.
TL / DR : Exists () et Any () sont également rapides.
Tout d'abord: l'analyse comparative à l'aide du chronomètre n'est pas précise ( voir la réponse de series0ne sur un sujet différent, mais similaire) ), mais elle est beaucoup plus précise que DateTime.
La façon d'obtenir des lectures vraiment précises est d'utiliser le profilage des performances. Mais une façon de se faire une idée de la façon dont les performances des deux méthodes se mesurent est d'exécuter des charges de temps des deux méthodes , puis de comparer le temps d'exécution le plus rapide de chacune. De cette façon, peu importe que le JIT et d'autres bruits nous donnent de mauvaises lectures (et c'est le cas ), parce que les deux exécutions sont " également erronées " dans un sens.
Après avoir exécuté le code ci-dessus 4 fois (qui à son tour font 1 000
Exists()
etAny()
sur une liste avec 1 000 000 éléments), il n'est pas difficile de voir que les méthodes sont à peu près aussi rapides.Il y a une légère différence, mais c'est une différence trop petite pour ne pas être expliquée par le bruit de fond. Je suppose que si l'on faisait 10 000 ou 100 000
Exists()
et à laAny()
place, cette légère différence disparaîtrait plus ou moins.la source
De plus, cela ne fonctionnera que si Value est de type bool. Normalement, cela est utilisé avec des prédicats. Tout prédicat serait généralement utilisé pour trouver s'il existe un élément satisfaisant une condition donnée. Ici, vous faites simplement une carte de votre élément i vers une propriété bool. Il recherchera un «i» dont la propriété Value est vraie. Une fois cela fait, la méthode retournera true.
la source
Lorsque vous corrigez les mesures - comme mentionné ci-dessus: Any et Exists, et en ajoutant la moyenne - nous obtiendrons la sortie suivante:
la source