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
相关产品推荐
相关产品推荐

