Форматирование данных с помощью linq в новый объект - PullRequest
1 голос
/ 24 апреля 2020

Я десериализировал этот json объект ниже, и я хотел бы переформатировать его в новый объект, используя linq в c#, и мне интересно, если кто-нибудь может мне помочь.

Я десериализовал объект в класс

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;}
}
"title": "Paul weight log",
"weight": [
    {
        "date": "2017-04-21T00:00:00Z",
        "weight": "120kg", 
    },
    {
        "date": "2017-09-15T00:00:00Z",
        "weight": "125kg", 
    },
    {
        "date": "2017-10-27T00:00:00Z",
        "weight": "130kg", 
    },
]
}

Это формат, в котором я хотел бы иметь его сейчас.

"title": "Paul weight log" "date": "2017-04-21T00:00:00Z" "weight": "120kg"
"title": "Paul weight log" "date": "2017-04-21T00:00:00Z" "weight": "125kg"
"title": "Paul weight log" "date": "2017-10-27T00:00:00Z" "weight": "130kg"

То, что я пытался сделать, - это создание нового класса

public class Info
{
    public string title{get;set;}
    public string weight{get;set;}
    public DateTime Date{get;set;}
}

Затем я попытался использовать foreach как на десериализованном объекте.

des.Data.forEach(c =>
{
    new Info()
    {
        Title = c.Title,
        Date = c.date,
        Weight =c.weight 
    };
});

Ответы [ 3 ]

1 голос
/ 25 апреля 2020

Вы были на правильном пути с SelectMany, потому что вы должны создать сплющенный список Data, умноженный на их Weight s:

from d in data
from w in d.Weight
select new
{
    d.title,
    w.Date,
    w.weight
}

, что равно SelectMany под поверхностью:

data.SelectMany(d => d.Weight, 
    (d, w) => new { d.title, w.Date, w.weight })

Здесь data является IEnumerable<Data>.

1 голос
/ 24 апреля 2020

Вы можете использовать метод Select для проецирования каждого Weight экземпляра на Info. Затем присвойте результат отдельной переменной (при условии, что data является экземпляром Data класса)

var result = data.Weight
    .Select(w => new Info { Date = w.Date, weight = w.weight, title = data.title })
    .ToList();

Foreach метод в вашем коде не может ничего вернуть

0 голосов
/ 25 апреля 2020

Используя ваши оригинальные определения классов, я собрал небольшое работающее 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"
                        }
                    }
                }
            };
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...