Сгруппируйте данные JSON по двум свойствам в C # - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь отобразить и сгруппировать данные json и сгруппировать компоненты и результаты всего массива по одному уникальному идентификатору, а затем по дате (для всех компонентов и результатов в массиве).

Я ужевзял данные из файла JSON, теперь я застрял с группировки данных ..

Любая помощь приветствуется, спасибо!

Patients.cs:

namespace ConsoleApp
{
    class Patient
    {

        public int ID{ get; set; }
        public string component { get; set; }
        public string result { get; set; }
        public string date { get; set; }
    }

    class Patients
    {
        public List<Patient> patients;
    }
}

ОБНОВЛЕНИЕ:

TABLE

1 Ответ

0 голосов
/ 12 декабря 2018

Вы должны сгруппировать данные о пациенте с ID и Date, чтобы вы могли сделать это с помощью linq.

...
JsonResponse = objReader.ReadLine();
Patients patients = JsonConvert.DeserializeObject<Patients>(JsonResponse);

var result = (from p in patients.patients
              group p by new { p.ID, p.date } into grp
              select new
              {
                  Key = grp.Key,
                  Items = grp.ToList()
              }).ToList();

foreach (var item in result)
{
    Console.WriteLine(item.Key.ID);
    Console.WriteLine(item.Key.date);
    Console.WriteLine();

    item.Items.ForEach(x => Console.WriteLine($"ID: {x.ID}, date: {x.date}, result: {x.result}, component: {x.component}"));
    Console.WriteLine();
}

Console.ReadLine();

Вывод:

1030
10/19/2018

ID: 1030, date: 10/19/2018, result: 1, component: A
ID: 1030, date: 10/19/2018, result: 2, component: B
ID: 1030, date: 10/19/2018, result: 3, component: C
ID: 1030, date: 10/19/2018, result: 4, component: D
ID: 1030, date: 10/19/2018, result: 5, component: E

1031
12/12/2019

ID: 1031, date: 12/12/2019, result: 6, component: A
ID: 1031, date: 12/12/2019, result: 7, component: B
ID: 1031, date: 12/12/2019, result: 8, component: C
ID: 1031, date: 12/12/2019, result: 9, component: D
ID: 1031, date: 12/12/2019, result: 10, component: E

Редактировать:

Для пользовательского вывода, показанного на скриншоте.

...
var result = (from p in patients.patients
              group p by new { p.ID, p.date } into grp
              select new
              {
                  Key = grp.Key,
                  Items = grp.ToList()
              }).ToList();

DataTable dt = new DataTable();
dt.Columns.Add("ID");
dt.Columns.Add("DATUM");

foreach (var item in result.Select(x => x.Items).FirstOrDefault())
{
    dt.Columns.Add(item.component);
}

foreach (var item in result)
{
    DataRow dr = dt.NewRow();
    dr["ID"] = item.Key.ID;
    dr["DATUM"] = item.Key.date;

    foreach (var innerItem in item.Items)
    {
        dr[innerItem.component] = innerItem.result;
    }

    dt.Rows.Add(dr);
}

foreach (DataRow row in dt.Rows)
{
    Console.WriteLine($"ID: {row["ID"]}, DATUM: {row["DATUM"]}, A: {row["A"]}, B: {row["B"]}, C: {row["C"]}, D: {row["D"]}, E: {row["E"]}");
}

Вывод:

ID: 1030, DATUM: 10/19/2018, A: 1, B: 2, C: 3, D: 4, E: 5
ID: 1030980, DATUM: 12/12/2019, A: 6, B: 7, C: 8, D: 9, E: 10
...