2010-01-22 2 views
2

Не то, чтобы это было лучше, но я пытаюсь развернуть следующий синтаксис метода для синтаксиса запроса, чтобы увидеть разницу.Преобразование синтаксиса метода linq для синтаксиса запроса

long diskSpace = Directory.EnumerateDirectories(@"c:\") 
        .SelectMany(Directory.EnumerateFiles) 
        .Sum(fileSize => new FileInfo(fileSize).Length); 

ответ

6

Этот запрос в основном эквивалентен:

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

(. Я переименовал fileSize к file более точно отражать смысл, кстати)

Там одна фактическая разница в данном случае - мы создаем нового делегата, который вызывает Directory.EnumerateFiles, а не , создавая делегата из группы методов Directory.EnumerateFiles. Другими словами, это один дополнительный уровень перенаправления - но это не повлияет на результаты, и я был бы поражен, если бы у него было какое-то значительное влияние .

+0

Спасибо, нужно снова настроить мой разум больше на sql и практиковать двойное от синтаксиса, который был бы соединением. –

+0

Барт Де Смет написал удобный перевод [обмотка] (http://bartdesmet.net/blogs/bart/archive/2008/08/30/c-3-0-query-expression-translation-cheat-sheet.aspx) для перехода между методом и синтаксисом запроса. – oillio

0

Нет никакой разницы.

Компилятор переводит синтаксис запроса aka LINQ в эти вызовы методов. Синтаксис запроса - это просто синтаксический suguar. Это не волшебство.

+3

Конечно, есть разница. Все выглядит иначе. И это был его смысл :) – Svish

+0

Под капотом это то же самое, да, но для кодирования, как вы можете видеть, существуют большие различия. – Finglas

+0

, возможно, было бы проще, или авантюрно идти с синтаксисом LINQ. но факт остается фактом, что он идентичен. то, что вы обычно не думаете при написании синтаксиса LINQ, заключается в том, что вы вытаскиваете множество переменных из анонимной области в свое «выражение», что невозможно без LINQ. Синтаксис LINQ, однако, обычно более читабельен, чем сетка методов расширения и временных переменных. –

Смежные вопросы