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

How to explain this incomprehensible result of IEnumerable.Where() clause?

我有以下测试代码:

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 文件的文件夹。设置断点会产生以下结果:

编辑

应要求,这里是手表的截图window。

重新评估前

重新评估后

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

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

在代码中,您将通过访问 IEnumerable 的值来强制枚举,通常通过在 foreach 中迭代它或调用 ToArray()ToList() 就可以了。