如何将对象数组合并到其他对象中

时间:2015-08-21 13:36:17

标签: c# linq

我在StackOverflow上的第一个问题。我在网上搜索过但没有找到这样一个具体案例。我将尝试尽可能具体。

我有一个Data个对象数组:

Data: 
[  
    { ID:"ID1", Name:"Name1", Date:"2015-08-21", TypeA:{ Count:1 }, TypeB:{ Count:2 } },  
    { ID:"ID2", Name:"Name2", Date:"2015-08-21", TypeA:{ Count:3 }, TypeB:{ Count:4 } },  
    { ID:"ID3", Name:"Name3", Date:"2015-08-23", TypeA:{ Count:5 }, TypeB:{ Count:6 } }  
]

我试图根据Type属性将所有这些对象数组分组到新对象中,即如果TypeX.Count > 0然后将其添加到Type主对象中。然后根据Date属性添加它们,如果日期相同,则在同一日期合并它们:

TypeA:
{  
  Dates:
  [ 
    { Date: "2015-08-21",
      Data: 
      [ 
        { ID: "ID1", Name: "Name1", Count: 1 },
        { ID: "ID2", Name: "Name2", Count: 3 }
      ]
    },
    { Date: "2015-08-23",
      Data: 
      [ 
        { ID: "ID3", Name: "Name1", Count: 5 }
      ]
    }
  ]  
},
TypeB:
{
  Dates:
  [ 
    { Date: "2015-08-21",
      Data: 
      [ 
        { ID: "ID1", Name: "Name1", Count: 2 },
        { ID: "ID2", Name: "Name2", Count: 4 }
      ]
    },
    { Date: "2015-08-23",
      Data: 
      [ 
        { ID: "ID3", Name: "Name3", Count: 6 }
      ]
    }
  ] 
}

我使用Javascript完成了这项工作,但现在我需要将整个逻辑传输到服务器端 - C#/ linq。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您需要GroupBy两次: -

var result = Data.GroupBy(x => x.Type)
                 .Select(x => new 
                        {
                             TypeAB = x.Key,
                             Obj = x.GroupBy(z => z.Date)
                                    .Select(z => new 
                                            {
                                                Date = z.Key,
                                                InnerObj = z.Select(i => new 
                                                             {
                                                                 Id = i.Id,
                                                                 Name = i.Name,
                                                                 Count = i.Count
                                                             })
                                            }).ToArray()
                       });

第一组Type,它将返回Key(除了TypeA,TypeB等)和IEnumerable(每个Type中的对象)。进一步按Date对此列表进行分组,并投影Key以及其他对象。在这里我投影匿名类型,如果你有一个,你可以选择实际的Type