问题描述
var ext = ".xml";
var xmlFiles = Directory.GetFiles(path,"*.*",SearchOption.AllDirectories).Where(s => ext.Equals(Path.GetExtension(s)));
var xmlFiles2 = Directory.GetFiles(path,SearchOption.AllDirectories);
var xmlFiles3 = xmlFiles2.Where(s => ext.Equals(Path.GetExtension(s)));
在这种情况下, path
会导致一个包含一个XML文件的文件夹。设置断点将产生以下结果:
-
xmlFiles
是空的IEnumerable<string>
-
xmlFiles2
是string[]
,其中包含一个成员,该成员具有文件夹中文件的路径。 -
xmlFiles3
与xmlFiles相同 - 直接在VS Watch窗口中评估表达式
Directory.GetFiles(path,SearchOption.AllDirectories).Where(s => ext.Equals(Path.GetExtension(s)))
实际上使我感到困惑。程序达到断点后,结果值为“此表达式引起副作用,将不被评估”。按下按钮以刷新评估会产生预期的结果,该结果是IEnumerable<string>
,其中包含一个具有我的XML文件路径的成员。为什么与xmlFiles
有什么区别?
根据要求,以下是监视窗口的屏幕截图。
重新评估之前
重新评估后
解决方法
监视窗口实际上并未显示xmlFiles
和xmlFiles3
为空。它表明它们尚未被枚举。在这种情况下,监视窗口将不会显示任何值(因为无法知道迭代器将产生什么),只有消息“扩展结果视图将枚举IEnumerable”。
要显示IEnumerable提供的值,只需展开“结果视图”。
在代码中,通常通过在IEnumerable
中对其进行迭代或访问foreach
或ToArray()
来访问ToList()
的值来强制进行枚举。它。