C#如何使用AddRange替代foreach直接生成错误日志列表
优化可行性结论
这个优化完全可行,不需要编写显式foreach循环,通过LINQ投影搭配AddRange方法即可直接生成目标错误集合,代码更简洁,也不会有额外性能损耗。
具体实现方案
首先先修正原代码里的三处基础问题:
- 原循环内变量命名不一致:循环变量定义为
aux,实际赋值时却用了不存在的problem变量 - 原
price属性是值类型decimal,非可空状态下永远不可能返回null,如果需要判空,要将属性定义为可空值类型decimal? - 原列表初始化存在拼写错误:
list<Products>应为List<Products>
优化后的完整代码如下:
public class Products { public int reportLine { get; set; } public string code { get; set; } // 可空价格类型,支持null判断 public decimal? price { get; set; } public int otherInfo1 { get; set; } public int otherInfo2 { get; set; } // 其余属性省略 } public class LogError { public string Message { get; set; } public int ExcelLine { get; set; } } // 读取Excel得到的产品列表 var listProducts = new List<Products> { // Excel导入的数据 }; // 直接筛选、投影后批量添加,无需手动写循环 errorList.AddRange( listProducts .Where(p => p.price == null) .Select(problemItem => new LogError { Message = "Price not found", ExcelLine = problemItem.reportLine }) );
实现说明
- 你之前实现失败的核心原因是把「筛选异常数据」和「跨类属性映射(Products转LogError)」拆成了两步,LINQ的
Select方法可以直接在筛选完成后完成类型投影,把每个Products对象映射为对应的LogError对象,不需要手动循环逐行赋值。 AddRange方法支持接收所有实现了IEnumerable<T>接口的参数,不需要提前把LINQ查询结果通过ToList()转成临时集合,能减少一次不必要的内存分配。- 不需要额外判断筛选结果是否为空:如果没有符合条件的异常数据,
AddRange遍历空枚举不会执行任何操作,额外加Count()判断反而会增加一次全量遍历计数的开销。
内容的提问来源于stack exchange,提问作者rd1218
相关产品推荐
相关产品推荐

