Преобразование синтаксиса метода linq в синтаксис запроса

2

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

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

2 ответа

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
    Барт Де Смет написал удобную шпаргалку для перевода между методом и синтаксисом запроса.
0

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

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

  • 3
    Конечно, есть разница. Это выглядит по-другому. И это был весь его смысл :)
  • 0
    Да, под капотом все то же самое, но, как вы можете видеть, есть большие различия.
Показать ещё 2 комментария
Сообщество Overcoder
Наверх
Меню