LINQ-合并父子数据

时间:2018-12-07 16:23:49

标签: c# linq merge

我是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 :(得分:0)

这听起来好像您在考虑一个人,如果他们具有相同的Name,那么,如果您加入两个列表,则任何具有相同名称的父母都应“合并”为一个人,并且在此过程中,他们的子级应该以相同的方式合并(如果他们都有一个名为“子级1”的子级,则合并后将只有一个“子级1”,否则,父级两个实例的所有子级都将合并)存在于父级的合并实例中。

如果是这种情况,那么我想您想做的是您小组中的Select new Person(),您将小组Key作为个人的名字,并使用{{ 1}},然后使用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的孩子...该孩子将存在于最终合并中吗?还是不?)。