C#如何基于公共标识符合并嵌套POCO对象的用户列表?
解决方案:用LINQ合并同ServerId的用户列表
要实现这个合并需求,我们可以利用C#的LINQ查询来分组并聚合用户数据,核心思路是按ServerId分组,然后合并每组内的所有用户列表,最后重新构建Company对象。
第一步:确保POCO类是可访问的
首先你需要把POCO类的成员和类本身设为public(否则LINQ无法访问内部属性):
public class Company { public string CompanyName { get; set; } public List<Server> Servers { get; set; } } public class Server { public int ServerId { get; set;} public string ServerName { get; set; } public List<User> Users { get; set; } } public class User { public string FirstName { get; set; } public string LastName { get; set; } }
第二步:实现合并逻辑
假设你已经有了原始的Company实例originalCompany,我们可以用LINQ的GroupBy和SelectMany来完成合并:
// 假设这是你的原始实例化数据 var originalCompany = new Company { CompanyName = "Company A", Servers = new List<Server> { new Server { ServerId = 134, ServerName = "HOST01", Users = new List<User> { new User { FirstName = "John", LastName = "Smith" }, new User { FirstName = "Bob", LastName = "Jones" } } }, new Server { ServerId = 232, ServerName = "HOST31", Users = new List<User> { new User { FirstName = "Michael", LastName = "Stevens" } } }, new Server { ServerId = 134, ServerName = "HOST01", Users = new List<User> { new User { FirstName = "Larry", LastName = "Edwards" }, new User { FirstName = "Craig", LastName = "White" } } } } }; // 执行合并操作 var mergedCompany = new Company { CompanyName = originalCompany.CompanyName, Servers = originalCompany.Servers // 按ServerId分组 .GroupBy(server => server.ServerId) // 每个分组生成一个新的Server对象 .Select(group => new Server { ServerId = group.Key, // 取分组内第一个Server的Name(假设同ID的ServerName一致) ServerName = group.First().ServerName, // 合并分组内所有Server的Users列表 Users = group.SelectMany(server => server.Users).ToList() }) .ToList() };
代码说明
GroupBy(server => server.ServerId):把所有Server对象按ServerId分组,这样相同ID的Server会被分到同一组。Select(group => new Server {...}):对每个分组创建新的Server实例:ServerId直接用分组的Key(也就是我们分组依据的ServerId)ServerName取分组内第一个Server的名称(如果你的场景中存在同ID但名称不同的情况,需要额外处理,比如抛出异常或统一名称)Users用SelectMany把分组内所有Server的Users列表扁平合并成一个列表
- 最后把处理后的Servers列表赋值给新的
Company对象,保留原有的CompanyName。
这样处理后,mergedCompany就会得到你想要的结构:ServerId=134的HOST01包含4位用户,ServerId=232的HOST31包含1位用户。
内容的提问来源于stack exchange,提问作者Brian Reading
相关产品推荐
相关产品推荐

