如何用LINQ/C#将对象的嵌套列表转为独立列表并关联原对象
实现方案
方法一:LINQ 简洁实现
利用SelectMany扁平化嵌套集合,同时为每个ObjectB关联对应的ObjectA:
// 假设你已有的ObjectA集合 List<ObjectA> objectAList = GetYourObjectAList(); // 提取并关联所有ObjectB List<ObjectB> allObjectBs = objectAList .SelectMany(a => a.ObjectBs? // 空条件运算符避免空引用 .Select(b => { b.ObjectA = a; b.ObjectAId = a.Id; // 可选:确保ObjectAId与对应ObjectA的Id一致 return b; })) .Where(b => b != null) // 过滤可能的空元素 .ToList();
方法二:传统循环实现
如果更倾向直观的控制逻辑,用嵌套循环完成:
List<ObjectA> objectAList = GetYourObjectAList(); List<ObjectB> allObjectBs = new List<ObjectB>(); foreach (var objectA in objectAList) { // 跳过空的ObjectBs集合,避免空引用异常 if (objectA.ObjectBs == null) continue; foreach (var objectB in objectA.ObjectBs) { objectB.ObjectA = objectA; objectB.ObjectAId = objectA.Id; // 可选:同步ID allObjectBs.Add(objectB); } }
注意事项
- 上述代码是引用修改:直接修改原
ObjectB对象的关联属性,如果需要保留原对象不变,需创建ObjectB的副本(克隆):// 克隆ObjectB示例 .SelectMany(a => a.ObjectBs.Select(b => new ObjectB { Id = b.Id, Name = b.Name, ObjectAId = a.Id, ObjectA = a })) - 若原数据中
ObjectB的ObjectAId已经与对应ObjectA的Id匹配,仅需赋值ObjectA属性即可,无需同步ObjectAId。
内容的提问来源于stack exchange,提问作者Hannah Hayes
相关产品推荐
相关产品推荐

