如何用LINQ/C#将ObjectA列表转换为含关联ObjectA的ObjectB列表
如何将ObjectA列表转换为包含关联ObjectA集合的ObjectB列表
类定义
public class ObjectA { public int Id { get; set; } public string Name { get; set; } // 其他需要保留的属性已省略 public int ObjectBId { get; set; } public ObjectB ObjectB { get; set; } } public class ObjectB { public int Id { get; set; } public string Name { get; set; } // 其他需要保留的属性已省略 public List<ObjectA> ObjectA { get; set; } }
需求说明
现有一个ObjectA列表,其中部分ObjectA共享同一个ObjectB(通过ObjectBId和ObjectB属性关联)。需要将该列表转换为去重后的ObjectB列表,每个ObjectB需包含所有与之关联的ObjectA集合,且保留ObjectA的全部属性(而非仅Id)。
示例
原ObjectA列表:
| Id | ObjectBId |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 2 |
转换后结果:
- ObjectB1(Id:1)包含1个ObjectA(Id:1)
- ObjectB2(Id:2)包含2个ObjectA(Id:2、3)
初始化代码
List<ObjectA> listObjectA = new List<ObjectA> { new ObjectA { Id = 1, Name = "ObjectA1", ObjectBId = 1, ObjectB = new ObjectB { Id = 1, Name = "ObjectB1" } }, new ObjectA { Id = 2, Name = "ObjectA2", ObjectBId = 2, ObjectB = new ObjectB { Id = 2, Name = "ObjectB2" } }, new ObjectA { Id = 3, Name = "ObjectA3", ObjectBId = 2, ObjectB = new ObjectB { Id = 2, Name = "ObjectB2" } }, };
解决方案
直接复用原ObjectB实例
使用LINQ分组后,直接复用分组内第一个ObjectA的ObjectB实例,并赋值关联的ObjectA列表:
var result = listObjectA .GroupBy(a => a.ObjectB.Id) .Select(g => { var targetB = g.First().ObjectB; targetB.ObjectA = g.ToList(); return targetB; }) .ToList();
创建新ObjectB实例(避免修改原实例)
如果担心修改原ObjectB实例会影响其他引用,可以创建新实例并复制所有属性:
var result = listObjectA .GroupBy(a => a.ObjectB.Id) .Select(g => { var originalB = g.First().ObjectB; return new ObjectB { Id = originalB.Id, Name = originalB.Name, // 补充复制其他需要保留的属性 ObjectA = g.ToList() }; }) .ToList();
内容的提问来源于stack exchange,提问作者Hannah Hayes
相关产品推荐
相关产品推荐

