GetFiles 和 EnumerateFiles 跳过 foreach 循环

GetFiles and EnumerateFiles skip the foreach loop

当运行以下代码时:

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 循环后,files 为 null
在 foreach 内部(在 in 语句处),程序跳回到 => 语句然后填充 files.完成后,它会跳过 foreach 循环并且永远不会进入它。

我在这里迷路了。为什么我的代码向后跳了一行?我尝试了 Enumerate 和 GetFiles,none 似乎有效。

代码 "jumping back" 的原因是所谓的 Deferred Execution。在 foreach 循环中使用结果之前,您拥有的 LINQ 表达式不会实际执行。

至于跳过 foreach 循环 - 这是因为枚举为空。正如@Slai 在评论中提到的,您的扩展列表可能有问题(忘记扩展名称前的“.”是一个常见错误)。

如果您希望枚举立即执行而不是延迟执行(使调试更容易),最简单的方法就是用 .ToList() 结束 LINQ 表达式,如下所示:

var files = dir.EnumerateFiles("*.*", SearchOption.AllDirectories)
    .Where(f => ext.Contains(Path.GetExtension(f.FullName)))
    .ToList();