Не то, чтобы это было лучше, но я пытаюсь заставить свою голову включить следующий синтаксис метода для синтаксиса запроса, чтобы увидеть разницу.
long diskSpace = Directory.EnumerateDirectories(@"c:\")
.SelectMany(Directory.EnumerateFiles)
.Sum(fileSize => new FileInfo(fileSize).Length);
Этот запрос в основном эквивалентен:
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
. Другими словами, это один дополнительный уровень перенаправления, но это не повлияет на результаты, и я был бы поражен, если бы он оказал значительное влияние на производительность.
Нет никакой разницы.
Компилятор переводит синтаксис запроса aka LINQ в эти вызовы методов. Синтаксис запроса - это просто синтаксический suguar. Это не волшебство.