c# - 如何解释 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>
xmlFiles2
是一个string[]
包含一个成员,其中包含文件夹中文件的路径xmlFiles3
与 xmlFiles 相同- 直接在 VS Watch-Window 中评估表达式
Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Where(s => ext.Equals(Path.GetExtension(s)))
实际上让我感到困惑。程序命中断点后,结果值为“此表达式会导致副作用,不会被计算”。按下按钮刷新评估会产生预期的结果,这是一个IEnumerable<string>
包含一个成员,其中包含我的 XML 文件的路径。为什么和这个不一样xmlFiles
??
编辑
根据要求,这里是监视窗口的屏幕截图。
重新评估前
重新评估后
解决方案
监视窗口实际上并没有显示,xmlFiles
并且xmlFiles3
是空的。这表明它们尚未被枚举。在这种情况下,监视窗口不会显示任何值(因为无法知道迭代器将产生什么),只有消息“扩展结果视图将枚举 IEnumerable”。
要显示 IEnumerable 提供的值,只需展开“结果视图”即可。
在代码中,您将通过访问它的值来强制枚举,IEnumerable
通常通过在 a 中迭代它foreach
或调用ToArray()
orToList()
来访问它。
推荐阅读
- python - 从熊猫数据系列中获取最小值的日期
- html - 内容隐藏在响应式网格 bootstrap-vue 中
- javascript - 删除属性,然后对对象数组中的其他值求和
- javascript - 使用 v-for 显示一列中的偶数索引和另一列中的奇数索引
- reactjs - 路由器链接没有加载组件
- python - Trying to plot outliers using DBSCAN
- file - wget & curl 输出“没有这样的文件或目录”
- akka - akka 和最多一次消息语义的好处
- sql - 使用 VBA 在 oracle 查询中创建日期变量
- tabs - 无法在新 Chromium EDGE 中独立于 Tab 到 Tab 设置 IME 键盘输入方法