【问题标题】:C#: Merge two objects based on common identifier?C#:基于公共标识符合并两个对象?
【发布时间】:2020-04-09 09:44:15
【问题描述】:

我有一个 POCO 类,其中的嵌套类定义如下:

class Company 
{  
   string CompanyName { get; set; }
   List<Server> Servers { get; set; }
}

class Server 
{
   int ServerId { get; set;}
   string ServerName { get; set; }
   List<User> Users { get; set; }
}

class User
{
   string FirstName { get; set; }
   string LastName { get; set; }
}

假设我用以下数据实例化了它:

CompanyName = "Company A";
Servers =    
   ServerId = 134;
   ServerName = HOST01;
   Users =
      FirstName = "John";
      LastName = "Smith";
      FirstName = "Bob";
      LastName = "Jones";

   ServerId = 232;
   ServerName = HOST31;
   Users = 
      FirstName = "Michael";
      LastName = "Stevens";

   ServerId = 134;
   ServerName = HOST01;
   Users =
      FirstName = "Larry";
      LastName = "Edwards";
      FirstName = "Craig";
      LastName = "White"; 

如何根据匹配的“ServerId”属性将所有用户合并在一起?基本上,我怎么能把它变成这个?

CompanyName = "Company A";
Servers =    
   ServerId = 134;
   ServerName = HOST01;
   Users =
      FirstName = "John";
      LastName = "Smith";
      FirstName = "Bob";
      LastName = "Jones";
      FirstName = "Larry";
      LastName = "Edwards";
      FirstName = "Craig";
      LastName = "White"; 

   ServerId = 232;
   ServerName = HOST31;
   Users = 
      FirstName = "Michael";
      LastName = "Stevens";

【问题讨论】:

  • 同一用户是否可以存在于多个“服务器”和/或公司中?
  • 是的。用户可以跨越服务器和公司

标签: c# sorting inner-classes


【解决方案1】:

使用 LINQ GroupByServerId 进行分组,并假设具有相同 id 的服务器也具有相同的名称。

var grouped = Companies // IEnumerable<Company>
    .Select(c => new Company
    {
        CompanyName = c.CompanyName,
        Servers = c.Servers
            .GroupBy(s => s.ServerId)
            .Select(grp => new Server
            {
                ServerId = grp.Key,
                ServerName = grp.First().ServerName,
                Users = grp.SelectMany(s => s.Users)).ToList()
            })
    });

【讨论】:

    【解决方案2】:

    您可以使用Linq,如以下代码:

    1 - 通过 id 和 name 获取不同的服务器:

    List<Server> distinctServers = company.Servers
        .GroupBy(s => new { s.ServerId, s.ServerName })
        .Select(s => new Server
        {
            ServerId = s.Key.ServerId,
            ServerName = s.Key.ServerName,
            Users = s.SelectMany(x => x.Users).ToList()
        }).ToList();
    

    2 - 建立新公司或使用旧公司:

    Company result = new Company
    {
        CompanyName = company.CompanyName,
        Servers = distinctServers
    };
    // or   
    company.Servers = distinctServers;
    

    如果你有公司列表,你可以在select函数中使用相同的代码:

    List<Company> companies = new List<Company> { company };
    List<Company> companiesWithDistinctServers = companies
        .Select(c => new Company
        {
            CompanyName = c.CompanyName,
            Servers = c.Servers.GroupBy(s => new { s.ServerId, s.ServerName })
                .Select(s => new Server
                {
                    ServerId = s.Key.ServerId,
                    ServerName = s.Key.ServerName,
                    Users = s.SelectMany(x => x.Users).ToList()
                }).ToList()
        }).ToList();
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 2015-08-27
      相关资源
      最近更新 更多