90 votes

Devrais-je utiliser deux clauses "où" ou "&&" dans ma requête LINQ?

Lors de l'écriture d'une requête LINQ avec de multiples "et" les conditions, devrais-je écrire un seul where clause contenant && ou multiple, where clauses, un pour chaque état?

static void Main(string[] args)
{
    var ints = new List<int>(Enumerable.Range(-10, 20));

    var positiveEvensA = from i in ints
                         where (i > 0) && ((i % 2) == 0)
                         select i;

    var positiveEvensB = from i in ints
                         where i > 0
                         where (i % 2) == 0
                         select i;

    System.Diagnostics.Debug.Assert(positiveEvensA.Count() == 
                                         positiveEvensB.Count());
}

Quelle est la différence autre que la préférence personnelle ou de style de codage (de longues lignes, de la lisibilité, etc.) entre positiveEvensA et positiveEvensB?

Une différence qui vient à l'esprit est que les différents fournisseurs LINQ peut être en mesure de mieux faire face à de multiples wheres plutôt que d'une expression plus complexe, est-ce vrai?

57voto

Reed Copsey Points 315315

Personnellement, je vais toujours aller avec le && vs deux clauses where chaque fois qu'il ne veut pas faire la déclaration inintelligible.

Dans votre cas, il ne sera probablement pas noticeble à tous, mais ayant 2 où l'une des clauses sera certainement avoir un impact sur les performances si vous avez une grande collection, et si vous l'utilisez tous les résultats de cette requête. Par exemple, si vous appelez .Count() sur les résultats, ou parcourir l'ensemble de la liste, la première clause where a terme, la création d'une nouvelle IEnumerable qui sera complètement énumérés à nouveau, avec un second délégué.

Enchaînant les 2 clauses ainsi que les causes de la requête pour former un seul délégué qui est exécuté tant que la collection est énuméré. Il en résulte une énumération par le biais de la collecte et un appel au délégué à chaque fois qu'un résultat est retourné.

Si vous le partagez, les choses changent. En tant que votre première clause where énumère la collection originale, le deuxième clause where énumère des résultats. Cela provoque, potentiellement (pire des cas), 2 énumérations dans votre collection et 2 délégués appelés par membre, ce qui pourrait signifier la présente déclaration (théoriquement) pourrait prendre 2x la vitesse d'exécution.

Si vous décidez de l'utiliser 2 où l'une des clauses, en plaçant le plus restrictive de la clause d'abord aidera un peu, depuis la deuxième clause where n'est exécutée que sur les éléments qui passer la première.

Maintenant, dans votre cas, ce ne sera pas question. Sur une grande collection, c'est possible. Comme une règle générale de pouce, je vais pour:

1) la Lisibilité et la maintenabilité

2) le Rendement

Dans ce cas, je pense que les deux options sont également facile à gérer, donc j'irais pour le plus performant de l'option.

26voto

JaredPar Points 333733

C'est principalement un problème de style personnel. Personnellement, tant que la clause where correspond à une ligne, je regroupe les clauses.

L'utilisation de plusieurs emplacements aura tendance à être moins performante, car elle nécessite une invocation de délégué supplémentaire pour chaque élément le rendant aussi loin. Cependant, il s'agira probablement d'un problème insignifiant et ne devrait être pris en compte que si un profileur le prouve.

1voto

DotnetDude Points 3353

Comme d'autres l'ont suggéré, il s'agit davantage d'une préférence personnelle. J'aime l'utilisation de && car elle est plus lisible et imite la syntaxe des autres langues courantes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X