Используя ваши оригинальные определения классов, я собрал небольшое работающее ASP. NET Базовое консольное приложение (см. Код ниже).
Преобразование из объекта Data
в объект Info
происходит в запросе LINQ, который является параметром infoList.AddRange(...);
.
GetData()
- это локальная функция, которая просто создает IList<Data>
содержит пару Data
объектов, каждый со встроенной коллекцией IList<Weight>
. Результат должен быть аналогичен содержанию объекта des
в вашем коде.
Обратите внимание, что .SelectMany()
запрашивает IList<Data>
, возвращаемый GetData()
, и возвращает IEnumerable<>
, содержащий один или несколько объектов для каждого объекта в коллекции, в которой он вызывается. Обратите внимание, что .Select()
и .SelectMany()
отличаются тем, что .Select()
создает только один выходной объект для каждого объекта в исходной коллекции, тогда как .SelectMany()
может возвращать несколько выходных объектов для каждого входного объекта.
Аргумент для .SelectMany()
- лямбда, d => d.Weight.Select(w => ...)
. Это важно, потому что класс Data
содержит набор (т. Е. IList<Weight>
) объектов Weight. Это позволяет нам иметь доступ к объекту Data
в аргументе d
и к каждому из объектов Weight - по одному за раз - в аргументе w
.
Наконец, .Select(...)
возвращает новый объект Info
для каждого объекта Weight
, содержащий значения свойств, как показано в коде.
using System;
using System.Collections.Generic;
using System.Linq;
namespace LinqReformatObject
{
class Program
{
static void Main(string[] args)
{
var infoList = new List<Info>();
infoList.AddRange(
GetData()
.SelectMany(d =>
d.Weight
.Select(w =>
new Info
{
title = d.title,
weight = w.weight,
Date = w.Date
}
)
)
);
foreach (var i in infoList)
{
Console.Write($"\"title\": \"{i.title}\", ");
Console.Write($"\"date\": \"{i.Date.ToString("O")}\",");
Console.Write($"\"weight\": \"{i.weight}\"");
Console.WriteLine();
}
}
public class Data
{
public string title { get; set; }
public List<Weight> Weight { get; set; }
}
public class Weight
{
public DateTime Date { get; set; }
public string weight { get; set; }
}
public class Info
{
public string title { get; set; }
public string weight { get; set; }
public DateTime Date { get; set; }
}
static IList<Data> GetData()
{
return new List<Data>()
{
new Data() {
title = "Paul's weight log",
Weight = new List<Weight>() {
new Weight () {
Date = DateTime.Parse("2017-04-21T00:00:00Z"),
weight = "120kg"
},
new Weight () {
Date = DateTime.Parse("2017-09-15T00:00:00Z"),
weight = "125kg"
},
new Weight () {
Date = DateTime.Parse("2017-10-27T00:00:00Z"),
weight = "130kg"
}
}
},
new Data() {
title = "John's weight log",
Weight = new List<Weight>() {
new Weight () {
Date = DateTime.Parse("2017-06-21T00:00:00Z"),
weight = "101kg"
},
new Weight () {
Date = DateTime.Parse("2017-08-15T00:00:00Z"),
weight = "98kg"
},
new Weight () {
Date = DateTime.Parse("2017-11-27T00:00:00Z"),
weight = "94kg"
}
}
},
new Data() {
title = "Ringo's weight log",
Weight = new List<Weight>() {
new Weight () {
Date = DateTime.Parse("2017-03-21T00:00:00Z"),
weight = "98kg"
},
new Weight () {
Date = DateTime.Parse("2017-06-15T00:00:00Z"),
weight = "100kg"
},
new Weight () {
Date = DateTime.Parse("2017-09-27T00:00:00Z"),
weight = "102kg"
}
}
},
new Data() {
title = "George's weight log",
Weight = new List<Weight>() {
new Weight () {
Date = DateTime.Parse("2017-01-21T00:00:00Z"),
weight = "99kg"
},
new Weight () {
Date = DateTime.Parse("2017-03-15T00:00:00Z"),
weight = "103kg"
},
new Weight () {
Date = DateTime.Parse("2017-05-17T00:00:00Z"),
weight = "113kg"
},
new Weight () {
Date = DateTime.Parse("2017-07-19T00:00:00Z"),
weight = "111kg"
},
new Weight () {
Date = DateTime.Parse("2017-09-23T00:00:00Z"),
weight = "109kg"
}
}
}
};
}
}
}