簡體   English   中英

C#:基於公共標識符合並兩個對象?

[英]C#: Merge two objects based on common identifier?

我有一個 POCO class 嵌套類定義如下:

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”屬性,我將如何 go 將所有用戶合並在一起? 基本上,我怎么能把它變成這個?

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";

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

您可以使用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 function 中使用相同的代碼:

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

我希望這有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM