C#中仅执行一次的foreach循环的最优替换方案是什么?
代码重构方案解答
你提出的if模式匹配替换方案是否合理
如果你的项目运行环境支持 C# 8.0及以上版本,这个替换是完全合理的:
- 语法合法:这是C#推出的集合模式匹配特性,会自动校验右侧集合是否存在至少一个元素,存在则将第一个元素赋值给你声明的
header变量 - 逻辑和原有
foreach + break的写法100%等价,执行效率没有任何差异 - 语义比原foreach写法更清晰,直接表达了「取集合第一个可用元素」的业务逻辑,完全符合你重构的目标
更通用的优化实现方案
如果需要兼容更低版本的C#,或者希望写法更贴合C#通用编码习惯,更推荐使用LINQ的FirstOrDefault()方法实现,改写后的完整代码如下:
int minReportNo = 0; if (ValueUtil.IsNull(parentRow) || tableName == CompResultHeadEntity.EntityTableName) { var firstHeader = dc.SelectEntities<CompResultHeadEntity>("", CompResultHeadEntity.ReportnoCol) .FirstOrDefault(); if (firstHeader != null) { minReportNo = firstHeader.Reportno; } if (minReportNo > 0) minReportNo = 0; }
这个方案的优势:
- 兼容性更强,支持C# 3.0及以上版本,适配绝大多数现有C#项目环境
- 写法更简洁,不需要额外写循环或者模式匹配代码,语义直接对应「取查询结果第一条记录」的需求
- 执行效率和原有写法、你提出的if模式匹配写法完全一致,无额外性能损耗
可选额外优化
结合你后续minReportNo > 0就置为0的逻辑,如果业务上确认查询得到的Reportno一定是正整数,整个逻辑可以进一步简化:
int minReportNo = 0; if (ValueUtil.IsNull(parentRow) || tableName == CompResultHeadEntity.EntityTableName) { // 只要集合有数据,最终minReportNo都会是0,不需要读取具体字段值 if (dc.SelectEntities<CompResultHeadEntity>("", CompResultHeadEntity.ReportnoCol).Any()) { minReportNo = 0; } }
该优化需要结合你的实际业务逻辑确认,避免修改原有执行逻辑。
内容的提问来源于stack exchange,提问作者S0ul3r
相关产品推荐
相关产品推荐

