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

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()
};

代码说明

  1. GroupBy(server => server.ServerId):把所有Server对象按ServerId分组,这样相同ID的Server会被分到同一组。
  2. Select(group => new Server {...}):对每个分组创建新的Server实例:
    • ServerId直接用分组的Key(也就是我们分组依据的ServerId)
    • ServerName取分组内第一个Server的名称(如果你的场景中存在同ID但名称不同的情况,需要额外处理,比如抛出异常或统一名称)
    • Users用SelectMany把分组内所有Server的Users列表扁平合并成一个列表
  3. 最后把处理后的Servers列表赋值给新的Company对象,保留原有的CompanyName。

这样处理后,mergedCompany就会得到你想要的结构:ServerId=134的HOST01包含4位用户,ServerId=232的HOST31包含1位用户。

内容的提问来源于stack exchange,提问作者Brian Reading

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:17:48