LINQ - объединить родительские и дочерние данные - PullRequest
0 голосов
/ 07 декабря 2018

Я новичок в linq и пытаюсь понять, как этот список сливается.Я пытаюсь объединить 2 списка родительских / дочерних данных следующим образом:

{
    "ParentsList1": 
    [
        {
            "Name": "Parent 1",
                "Children": [
                    {
                        "Name": "Child 1",
                    },
                    {
                        "Name": "Child 2",
                    }
                ],
        },
          {
            "Name": "Parent 2",
                "Children": [
                    {
                        "Name": "Child 1",
                    }
                ],
          }
    ]
}

{
    "ParentsList2": 
    [
        {
            "Name": "Parent 1",
                "Children": [
                    {
                        "Name": "Child 1",
                    },
                    {
                        "Name": "Child 2",
                    },
                    {
                        "Name": "Child 3",
                    }
                ],
        },
          {
            "Name": "Parent 2",
                "Children": [
                    {
                        "Name": "Child 2",
                    }
                ],
          }
    ]
}

--------------- Объединенный вывод ----------------

{
    "MergedParentsList": 
    [
        {
            "Name": "Parent 1",
                "Children": [
                    {
                        "Name": "Child 1",
                    },
                    {
                        "Name": "Child 2",
                    },
                    {
                        "Name": "Child 3",
                    }
                ],
        },
          {
            "Name": "Parent 2",
                "Children": [
                    {
                        "Name": "Child 2",
                    }
                ],
          }
    ]
}

Я хотел бы объединить, чтобы удалить / заменить дочерние объекты.До сих пор я застрял, работая с объединением

List<ParentListModel> mergedParentLists = ParentsList1
    .Union(ParentsList2)                                                                         
    .GroupBy(grp => new {grp.Name})
    .Select(sel => sel.FirstOrDefault())
    .ToList();

Кажется, что список Родителя в порядке, но не получается синхронизировать дочерние данные ...

1 Ответ

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

Звучит так, как будто вы считаете человека идентичным, если у него одинаковое Name, поэтому, если вы присоединитесь к двум спискам, то все родители с одинаковым именем должны быть "объединены" в одно лицо, и в этомВ процессе, их дочерние элементы должны быть объединены одинаково (если у них обоих есть дочерний элемент с именем «Дочерний 1», то после слияния будет только один «дочерний элемент 1», но в противном случае все дочерние элементы из обоих экземпляров родительского элемента существуют вобъединенный экземпляр родительского элемента).

Если это так, то я думаю, что вы хотите сделать Select new Person() из вашей группы, где вы берете группу Key в качестве имени человека, идобавьте детей с помощью SelectMany для всех детей в группе, а затем выберите только уникальных с помощью DistinctyBy(child.Name).

Например:

List<ParentListModel> mergedParents = parentList1
    .Union(parentList2)
    .GroupBy(parent => parent.Name)
    .Select(group =>
        new ParentListModel
        {
            Name = group.Key,
            Children = group
                .SelectMany(parent => parent.Children)
                .DistinctBy(child => child.Name)
                .ToList()
        })
    .ToList();

Также, в вашем вопросе есть некоторая двусмысленность, где в комментариях вы упомянули, что во время слияния parentList2 должен "победить".Если под этим вы подразумеваете, что хотите добавить только родителей из parentList1, которых нет в parentList2, то вы можете просто сделать AddRange, где вы добавляете родителей, чье имя не существует в parentList2:

parentList2.AddRange(parentList1.Where(pl1Parent =>
    parentList2.All(pl2Parent => pl2Parent.Name != pl1Parent.Name)));

Неопределенность существует, потому что ваш пример верен для обоих этих сценариев.Было бы лучше, если бы вы включили пример, исключающий один из них (например, если у Parent 1 в parentList1 есть дочерний элемент с именем Child 9 ... будет ли этот дочерний элемент в окончательном слиянии или нет?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...