当前位置: 首页 > news >正文

解决修改IEnumerable不成功的问题

我使用ExcelMapper读取了一个Excel,得到

var excelData = new ExcelMapper(workbook) { HeaderRow = false, MinRowNumber = 2 }
.Fetch<UsersExcelModel>().Select((p, i) => { p.RowNo = i + 3; return p; });

  

之后,修改excelData的内容

 

foreach (var item in excelData)
{item.UserStatus= UserStatus.OnLine;
}

  

让我费解现象出现了:在foreach中修改枚举UserStatus的值成功,但出了循环,excelData里的UserStatus枚举值还是老样子。

class列表是引用类型,不是值类型,我只是修改引用类型属性的值,又不是修改它的引用,怎么会这样?

一番苦找,最终确定,这是IEnumerable<>的延迟执行的特性所导致的。

因为ExcelMapperFetch返回的是IEnumerable<>类型,而IEnumerable<>自带延迟执行。每次遍历IEnumerable<>,查询都会重新执行。如果底层数据源(如数据库上下文、一个每次返回新实例的工厂方法)在两次遍历之间发生了变化,或者查询本身会生成新对象(例如使用了 Select投影),那么第二次遍历到的对象,很可能已经不是第一次遍历时修改的那个对象了。这就造成了“循环内修改有效,循环外看似无效”的假象。

 

解决方案:在excelData后增加.ToList(),让结果立刻加载“固化”到内存中,阻止其延迟执行。

var excelData= new ExcelMapper(workbook) { HeaderRow = false, MinRowNumber = 2 }
.Fetch<UsersExcelModel>().Select((p, i) => { p.RowNo = i + 3; return p; }).ToList();

  

 

http://www.zskr.cn/news/53957.html

相关文章:

  • 2025年知名的编织金属网厂家推荐及选购指南
  • 2025年知名的热风循环回火炉厂家推荐及采购指南
  • Ragflow知识图谱构建
  • PG事务id回卷问题概述
  • file文件的复制拷贝
  • 【第5章 序列、集合和字典】循环引用
  • 2025年热门的钣金加工用户口碑最好的厂家榜
  • MATLAB自适应子空间辨识工具箱
  • 2025年11月deepseek排名优化评测报告:从核心优势到实战案例的深度解析
  • linux c语言线程
  • linux c语言程序
  • 【第7章 IO编程与异常】文件句柄(File Handle)和 Python 中的文件对象(File Object)详解
  • 2025年质量好的扁型管缩管机用户口碑最好的厂家榜
  • 2025年热门的托盘提升机最新TOP厂家排名
  • llama.cpp指定GPU运行解决rocm调用报错
  • 2025年质量好的锰钢耙片耙厂家推荐及采购参考
  • 基于MATLAB的混合动力汽车(HEV)简单整车模型实现
  • 【第7章 IO编程与异常】文件位置指示器
  • 2025年11月豆包排名优化排行榜:十大优质服务商综合能力与长期发展指南
  • 2025年11月豆包排名优化对比分析:基于权威数据的十大机构全景评估
  • 2025年评价高的建筑变形缝厂家推荐及选择指南
  • 【每日一面】如何解决内存泄漏
  • 2025年11月geo优化服务商推荐榜:十大服务商综合实力与行业口碑全解析
  • 2025 最新火花机厂家推荐榜:新型 / 镜面 / 数控 / 五轴联动等全品类优选,权威测评助力精密加工选型
  • 2025年11月geo优化公司排行榜:头部服务商技术迭代与长期发展指南
  • 2025年11月豆包关键词排名优化对比分析:基于权威数据的十大企业综合评估
  • 2025年北京无极太极机构权威推荐榜单:万元礼物/无极太极站桩/太极站桩源头机构精选
  • 2025年11月北京geo优化公司排行榜:十大优质服务商综合能力与长期发展指南
  • 2025年万元音箱品牌权威推荐榜单:万元礼物/万元级礼物/万元级黑胶唱机品牌精选
  • 2025年11月ai排名优化排行榜:十大优质企业服务能力与长期发展指南