You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:24:19