Quelqu'un peut m'expliquer comment le LINQ fonctions Où(..) et FindAll(..) est-elle différente? Ils semblent tous deux à faire la même chose...
Réponses
Trop de publicités?FindAll()
est une fonction sur l' List<T>
type, ce n'est pas une extension LINQ méthode Where
. L'extension LINQ méthodes de travail sur n'importe quel type qui implémente IEnumerable
, alors que FindAll
peut être utilisée uniquement sur List<T>
occurrences (ou des instances de classes qui héritent de lui, bien sûr).
En outre, ils diffèrent dans le réel but. Where
retourne une instance de IEnumerable
qui est exécutée à la demande lorsque l'objet est énuméré. FindAll
renvoie un nouveau List<T>
qui contient les éléments demandés. FindAll
est plus semblable à l'appel d' Where(...).ToList()
sur une instance de IEnumerable
.
La plus grande différence pour moi est que .FindAll est également disponible dans .Net 2.0. Je n'ai pas toujours le luxe de programme .Net 3.5, donc j'essaie de me rappeler les "indigènes" des méthodes de la .Net générique collections.
C'est arrivé plusieurs fois que j'ai mis en place un méthode de la Liste moi-même parce que je ne pouvais pas LINQ.
Ce que je trouve très pratique dans ce cas est que, à l'aide de VS2008, je peux utiliser l'inférence de type et le lambda de la syntaxe. Ce sont les fonctions du compilateur, pas de fonctionnalités d'infrastructure. Cela signifie que je peux écrire ce et toujours rester à l'intérieur .Net 2.0:
var myOddNums = myNums.FindAll(n => n%2==1);
Mais si vous avez des LINQ disponibles, en gardant la différence entre l'exécution différée et l'exécution immédiate est important.
Si je me souviens bien, la principale différence (en plus de ce qu'ils sont mis en œuvre sur: IEnumerable<T>
vs List<T>
) est qu' Where
met en œuvre l'exécution différée, où il ne fait pas faire de la recherche jusqu'à ce que vous en avez besoin-de l'utiliser dans une boucle foreach par exemple. FindAll
est une exécution immédiate de la méthode.
J'ai fait quelques tests sur une liste de 80K des objets et a constaté que Find()
peut être jusqu'à 1000% plus rapide que d'utiliser un Where
avec FirstOrDefault()
. Je ne le savais pas jusqu'à ce que le test d'un timer avant et après chaque appel. Parfois c'est le même temps, d'autres fois c'était plus rapide.