2010-01-22 7 views

Répondre

6

Cette requête est essentiellement équivalente à:

long diskSpace = (from directory in Directory.EnumerateDirectories(@"c:\") 
        from file in Directory.EnumerateFiles(directory) 
        select file) 
       .Sum(file => new FileInfo(file).Length); 

(. Je l'ai retitré fileSize à file pour représenter plus précisément le sens, btw)

Il y a une réelle différence dans ce cas - nous créons un nouveau délégué qui appelle Directory.EnumerateFiles plutôt que directement en créant un délégué du groupe de méthode Directory.EnumerateFiles. En d'autres termes, il s'agit d'un niveau supplémentaire de redirection - mais cela n'aura aucun effet sur les résultats et je serais étonné si cela avait un impact significatif sur les performances.

+0

Merci, besoin d'accorder mon esprit plus vers sql à nouveau, et pratiquer le dual de la syntaxe qui serait la jointure. –

+0

Bart De Smet a écrit une traduction pratique [feuille de triche] (http://bartdesmet.net/blogs/bart/archive/2008/08/30/c-3-0-query-expression-translation-cheat-sheet.aspx) pour aller entre la méthode et la syntaxe de requête. – oillio

0

Il n'y a pas de différence.

Le compilateur traduit la syntaxe de requête aka LINQ, dans ces appels de méthodes. La syntaxe de requête est juste syntaxique suguar. Ce n'est pas magique.

+3

Bien sûr, il y a une différence. Ça a l'air différent. Et c'était tout son point :) – Svish

+0

Sous le capot c'est pareil, oui, mais pour le codage comme vous pouvez le voir il y a de grandes différences. – Finglas

+0

il pourrait être plus facile, ou adventagous d'aller avec la syntaxe LINQ. mais le fait reste qu'il est identique. ce que vous ne pensez généralement pas lorsque vous écrivez la syntaxe LINQ, c'est que vous tirez beaucoup de variables d'une portée anonyme dans votre "expression" quelque chose qui, sans LINQ, n'est pas possible. La syntaxe LINQ est cependant généralement plus lisible qu'un maillage de méthodes d'extension et de variables temporaires. –