-2

我是 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();

这似乎使父列表正常,但似乎无法同步子数据...

4

1 回答 1

0

听起来你在考虑一个人是相同的,如果他们有相同的Name,所以如果你加入两个列表,那么任何同名的父母都应该“合并”成一个人,在这个过程中,他们的孩子应该是以相同的方式合并(如果他们都有一个名为“Child 1”的孩子,那么在合并之后将只有一个“Child 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 1parentList1一个名为Child 9...的孩子......该孩子是否存在于最终合并中?)。

于 2018-12-07T17:21:46.340 回答