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();
当运行以下代码时:
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();