如何解释IEnumerable.Where子句的这种难以理解的结果?

问题描述

我有以下测试代码

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>
  • xmlFiles2string[],其中包含一个成员,该成员具有文件夹中文件的路径。
  • xmlFiles3与xmlFiles相同
  • 直接在VS Watch窗口中评估表达式Directory.GetFiles(path,SearchOption.AllDirectories).Where(s => ext.Equals(Path.GetExtension(s)))实际上使我感到困惑。程序达到断点后,结果值为“此表达式引起副作用,将不被评估”。按下按钮以刷新评估会产生预期的结果,该结果是IEnumerable<string>,其中包含一个具有我的XML文件路径的成员。为什么与xmlFiles有什么区别?

修改

根据要求,以下是监视窗口的屏幕截图。

重新评估之前

enter image description here

重新评估后

enter image description here

解决方法

监视窗口实际上并未显示xmlFilesxmlFiles3为空。它表明它们尚未被枚举。在这种情况下,监视窗口将不会显示任何值(因为无法知道迭代器将产生什么),只有消息“扩展结果视图将枚举IEnumerable”。

要显示IEnumerable提供的值,只需展开“结果视图”。

在代码中,通常通过在IEnumerable中对其进行迭代或访问foreachToArray()来访问ToList()的值来强制进行枚举。它。