2009-06-23 3 views
2

de ces deux options:Le mot clé from est-il préférable aux appels de méthode directs en C#?

var result = from c in coll where c % 2 == 0 select c; 

var result = coll.Where (c => c % 2 == 0); 

Ce qui est préférable?

Y at-il un avantage à utiliser l'un sur l'autre? Pour moi, le second a l'air mieux, mais j'aimerais entendre les opinions des autres.

+0

duplication possible de [LINQ - Expression courante et requête - Y a-t-il un ou plusieurs avantages de l'un sur l'autre?] (Http://stackoverflow.com/questions/214500/linq-fluent-and-query-expression- est-il-des-avantages-de-un-sur-autre) – Matt

Répondre

7

Si vous avez seulement une ou deux clauses, je choisirais la notation par points. Lorsque vous commencez à faire des jointures, des regroupements ou tout autre élément introduisant des identifiants transparents, la syntaxe de la requête commence à séduire beaucoup plus.

Il vaut souvent la peine d'essayer dans les deux sens et de voir ce qui est le plus lisible pour cette situation particulière.

En termes de code généré, ils seront exactement les mêmes dans la plupart des cas. Parfois, il y aura une surcharge que vous pouvez utiliser en notation par points, ce qui le rend plus simple que la syntaxe de l'expression de requête, mais valorise la lisibilité sur tout le reste dans la plupart des cas. J'ai également blog post sur ce sujet. Je recommanderais certainement aux développeurs d'être à l'aise avec les deux options - je serais très inquiet si un collègue utilisait LINQ mais ne comprenait pas les principes de base des expressions de requête, par exemple. (Ils n'ont pas besoin de connaître toutes les traductions, mais une certaine idée de ce qui se passe leur facilitera la vie.)

+0

Merci Jon. Corrigé maintenant. Qu'entendez-vous par "identifiants transparents"? –

+1

(Je vais éditer la réponse pour supprimer ce bit.) Les identifiants transparents sont introduits de sorte que si vous avez plusieurs variables de plage impliquées (par exemple de x dans Foo de y dans x.Quelque chose - x et y sont des variables de plage) tout fonctionne encore, même si vous n'avez qu'une seule séquence plus tard - en gros, le compilateur crée plus de types anonymes pour vous. Faire cela manuellement peut rendre le code moins clair. –

+0

Merci Jon. Peut-on utiliser des valeurs intermédiaires en utilisant "let" en notation pointée? Aussi comment votre exemple "de x dans Foo de y dans x.Quelque chose" ressemblerait-il à la notation par points? Foo.Where (...) Où? –

2

J'utilise toujours la syntaxe lambda parce que pour moi, c'est plus clair ce qui se passe et ça a l'air cool pour démarrer. Mais nous avons quelques devs ici qui font toujours le contraire (nerds sql je suppose :) Heureusement, les outils comme ReSharper peuvent simplement transformer entre les deux avec un clic.

Questions connexes