Quelqu'un peut-il expliquer en quoi les fonctions LINQ Where (..) et FindAll (..) diffèrent? Ils semblent tous les deux faire la même chose ...
Quelqu'un peut-il expliquer en quoi les fonctions LINQ Where (..) et FindAll (..) diffèrent? Ils semblent tous les deux faire la même chose ...
Réponses:
FindAll()
est une fonction sur le List<T>
type, ce n'est pas une méthode d'extension LINQ comme Where
. Les méthodes d'extension LINQ fonctionnent sur tous les types qui implémentent IEnumerable
, alors qu'elles FindAll
ne peuvent être utilisées que sur des List<T>
instances (ou des instances de classes qui en héritent, bien sûr).
En outre, ils diffèrent par leur objectif réel. Where
renvoie une instance de IEnumerable
qui est exécutée à la demande lorsque l'objet est énuméré. FindAll
renvoie un nouveau List<T>
contenant les éléments demandés. FindAll
est plus comme appeler Where(...).ToList()
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 programmer en .Net 3.5, j'essaie donc de me souvenir des méthodes «natives» des collections génériques .Net.
Il m'est arrivé plusieurs fois que j'ai moi-même implémenté une méthode List déjà disponible car je ne pouvais pas la LINQ.
Ce que je trouve pratique dans ce cas, c'est que, en utilisant VS2008, je peux utiliser l'inférence de type et la syntaxe lambda. Ce sont des fonctionnalités du compilateur, pas des fonctionnalités du framework. Cela signifie que je peux écrire ceci tout en restant dans .Net 2.0:
var myOddNums = myNums.FindAll(n => n%2==1);
Mais si vous disposez de LINQ, il est important de garder la différence entre l'exécution différée et l'exécution immédiate.
Si je me souviens bien, la principale différence (en plus de ce sur quoi ils sont implémentés: IEnumerable<T>
vs. List<T>
) est qu'il Where
implémente une exécution différée, où il ne fait pas la recherche jusqu'à ce que vous en ayez besoin - en l'utilisant dans une boucle foreach par exemple. FindAll
est une méthode d'exécution immédiate.
J'ai fait quelques tests sur une liste d'objets de 80K et j'ai trouvé que cela Find()
pouvait être jusqu'à 1000% plus rapide que d'utiliser un Where
avec FirstOrDefault()
. Je ne savais pas cela avant de tester une minuterie avant et après chaque appel. Parfois c'était le même temps, d'autres fois c'était plus rapide.