2010-03-11 4 views
2

Laquelle de ces deux instructions est la plus rapide/meilleure pratique?Linq method body Bonne pratique question

myList.Where(x => 
      { 
       bool itemOne= x.ItemOne == paramItemOne; 
       bool itemTwo = x.ItemTwo == paramItemTwo; 
       return itemOne && itemTwo; 
      }) 


myList.Where(x => x.ItemOne == paramItemOne).Where(x=>x.ItemTwo == paramItemTwo) 

ou sont-ils identiques?

Répondre

7

Je ne dirais pas non plus. Le plus rapide va être:

myList.Where(x => x.ItemOne == paramItemOne && x.ItemTwo == paramItemTwo) 

(en supposant que le compilateur/JIT ne pas optimiser les affectations de variables loin dans votre 1ère forme)

La deuxième forme sera plus lente, car il peut impliquer beaucoup plus la méthode invocation sur les délégués fournis aux instructions Where.

+1

Le compilateur ne peut pas optimiser le second booléen dans la première forme - il supprimerait les effets secondaires. – SLaks

0

Les performances sont identiques ou très proches. Le second pourrait avoir plus de frais généraux de méthode.

Plus important que la performance, je dirais que la première est une meilleure pratique car il est beaucoup plus clair.

1

Les résultats sont les mêmes, cependant, je vous recommande d'écrire ceci:

myList.Where(x => 
      { 
       return x.ItemOne == paramItemOne && x.ItemTwo == paramItemTwo; 
      }); 

Ceci est garanti pour travailler plus vite, parce que maintenant x.ItemTwo == paramItemTwo ne sera même pas calculé si x.ItemOne == paramItemOne

+0

Um ... les deux conditions doivent être satisfaites, donc votre assertion finale ne tient pas. Les deux prédicats doivent être évalués pour ET pour être vrais. Cependant, dans le cas où x.ItemOne! = ParamItemOne, le second prédicat ne sera pas évalué, mais cela vaut également pour le formulaire Where(). Where(), en tant qu'éléments filtrés par la première instruction Where ne fera pas partie de l'énumérable contre lequel la seconde Où exécute. – spender

0

Le premier vérifie les deux conditions de réponse par élément de la liste. Le second filtre par la première condition, puis filtre le résultat par la deuxième condition.

La seconde est la création et le remplissage d'une autre collection temporaire, mais fait moins de comparaison pour la deuxième condition.

Questions connexes