如何解释 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 文件的文件夹。设置断点会产生以下结果:
xmlFiles
是空的 IEnumerable<string>
xmlFiles2
是一个 string[]
包含一个成员,其中包含文件夹中文件的路径
xmlFiles3
与 xmlFiles 相同
- 直接在 VS Watch-Window 中计算表达式
Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Where(s => ext.Equals(Path.GetExtension(s)))
实际上让我感到困惑。程序命中断点后,结果值为“此表达式导致副作用,将不被评估”。按下按钮刷新评估会产生预期的结果,这是一个 IEnumerable<string>
,其中包含一个成员以及我的 XML 文件的路径。为什么这与 xmlFiles
不同 ??
编辑
应要求,这里是手表的截图window。
重新评估前
重新评估后
手表 window 实际上并没有显示 xmlFiles
和 xmlFiles3
是空的。这表明它们还没有被枚举。在这种情况下,watch window 不会显示任何值(因为无法知道迭代器将产生什么),只有消息“展开结果视图将枚举 IEnumerable”。
要显示 IEnumerable 提供的值,只需展开“结果视图”即可。
在代码中,您将通过访问 IEnumerable
的值来强制枚举,通常通过在 foreach
中迭代它或调用 ToArray()
或 ToList()
就可以了。
我有以下测试代码:
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-Window 中计算表达式
Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Where(s => ext.Equals(Path.GetExtension(s)))
实际上让我感到困惑。程序命中断点后,结果值为“此表达式导致副作用,将不被评估”。按下按钮刷新评估会产生预期的结果,这是一个IEnumerable<string>
,其中包含一个成员以及我的 XML 文件的路径。为什么这与xmlFiles
不同 ??
编辑
应要求,这里是手表的截图window。
重新评估前
重新评估后
手表 window 实际上并没有显示 xmlFiles
和 xmlFiles3
是空的。这表明它们还没有被枚举。在这种情况下,watch window 不会显示任何值(因为无法知道迭代器将产生什么),只有消息“展开结果视图将枚举 IEnumerable”。
要显示 IEnumerable 提供的值,只需展开“结果视图”即可。
在代码中,您将通过访问 IEnumerable
的值来强制枚举,通常通过在 foreach
中迭代它或调用 ToArray()
或 ToList()
就可以了。