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

C#使用AddRange添加对象列表时修改属性补全null值

实现方案

你采用AddRange批量处理的思路是可行的,原有写法的问题在于Select投影仅返回了Name字段的字符串值,没有保留item对象的其他属性,稍作修正即可正常使用。

优先实现(基于AddRange)

在Select逻辑中完成null值的替换即可,根据是否需要保留API返回的原始对象,可选择对应写法:

  • 无特殊要求时可直接修改API返回的item对象,代码最简洁
var result = new List<Item>();
foreach (var obj in objects)
{
    var items = // 执行API调用获取当前批次的item列表
    result.AddRange(items.Select(t =>
    {
        t.Name = t.Name ?? obj.Name;
        return t;
    }));
}
return result;
  • 如果不希望修改API返回的原始对象,可投影生成新的item实例加入结果集
var result = new List<Item>();
foreach (var obj in objects)
{
    var items = // 执行API调用获取当前批次的item列表
    result.AddRange(items.Select(t => new Item
    {
        // 按Item的实际定义赋值所有非Name属性
        Id = t.Id,
        CreateTime = t.CreateTime,
        // 其余属性省略...
        Name = t.Name ?? obj.Name
    }));
}
return result;

如果Item的属性较多,不想逐行手动复制属性,可以引入对象映射工具做浅拷贝后再替换Name值,减少重复编码。

可选替代写法

如果觉得LINQ内联赋值的写法可读性一般,也可以先遍历当前批次的items补全Name值,再统一调用AddRange,执行逻辑和上述方案完全一致:

var result = new List<Item>();
foreach (var obj in objects)
{
    var items = // 执行API调用获取当前批次的item列表
    foreach (var item in items)
    {
        // C# 8.0及以上版本支持??=空合并赋值运算符,等价于判空后赋值的逻辑
        item.Name ??= obj.Name;
    }
    result.AddRange(items);
}
return result;

优化提示

如果业务场景中Name为空字符串、仅包含空白字符也属于无效值,可以把null判断替换为string.IsNullOrWhiteSpace(t.Name) ? obj.Name : t.Name,覆盖更多异常返回的情况。

内容的提问来源于stack exchange,提问作者Milind Mohapatra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:18:20