GetFiles и EnumerateFiles пропускают цикл foreach

При запуске следующего кода:

var files = dir.EnumerateFiles("*.*",
    SearchOption.AllDirectories).Where(f => ext.Contains(Path.GetExtension(f.FullName)))
foreach (FileInfo file in files)
  {
    file.CopyTo(destPath, true);
  }

Где dir — это DirectoryInfo
Где ext — это список строк, содержащих допустимые расширения файлов.

При переходе к циклу foreach файлы имеют значение null.
Внутри foreach (в операторе in) программа переходит обратно к =>< Оператор /em> затем заполняет файлы. Когда это сделано, он пропускает цикл foreach и никогда не входит в него.

Я потерялся здесь. Почему мой код перескакивает на одну строку назад? Пробовал Enumerate и GetFiles, ничего не работает.


person Gildo Conte    schedule 22.06.2017    source источник
comment
Возможно, расширениям нужна точка в списке расширений.   -  person Slai    schedule 22.06.2017
comment
Это тоже сработало. Спасибо за помощь.   -  person Gildo Conte    schedule 22.06.2017


Ответы (1)


Причина того, что код «прыгает назад», называется Отложенное выполнение. Выражение LINQ, которое у вас есть, на самом деле не выполняется, пока результаты не будут использованы в цикле foreach.

Что касается пропуска цикла foreach - это происходит потому, что перечисление пусто. Как упоминалось в комментарии @Slai, может возникнуть проблема с вашим списком расширений (распространенной ошибкой является забывание «.» перед именем расширения).

Если вы хотите, чтобы перечисление выполнялось немедленно, а не откладывалось (упрощает отладку), самый простой способ — просто закончить выражение LINQ с помощью .ToList() следующим образом:

var files = dir.EnumerateFiles("*.*", SearchOption.AllDirectories)
    .Where(f => ext.Contains(Path.GetExtension(f.FullName)))
    .ToList();
person Eric Petroelje    schedule 22.06.2017
comment
Мне придется прочитать об этом отложенном исполнении. Это определенно исправило это. Спасибо. - person Gildo Conte; 22.06.2017