【问题标题】:LINQ - Merge parent and child dataLINQ - 合并父子数据
【发布时间】:2019-05-09 10:42:19
【问题描述】:

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

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

【问题讨论】:

  • 您是否试图获得Children 集合的联合?或者你想remove/replaceChildren在工会中?
  • 您的输出与第二个列表相同,因此将其与第一个列表合并不会产生任何差异并不明显。
  • 如果您删除所有内容并将其替换为第二个列表,为什么不将其分配给第二个列表?上面似乎没有发生任何“合并”...MergedParentsList == ParentsList2(也许您只需要更好的样本数据)。
  • 对不起,我的问题很糟糕......哈哈。我需要保留第一个列表中的父实体,从第二个列表中添加任何新的父实体,然后合并子实体,以便 parentlist2 获胜……这有意义吗?
  • 听起来你认为如果一个人有相同的名字,他们是相同的,所以如果你加入两个列表,那么同名的父母应该被“合并”成一个人,并且在这个过程中,他们的孩子列表应该以相同的方式合并(如果他们都有一个名为“孩子1”的孩子,那么合并后将只有一个“孩子1”)。

标签: c# linq merge


【解决方案1】:

听起来你认为如果一个人有相同的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();

此外,您的问题存在一些歧义,在您提到的 cmets 中,在合并期间,parentList2 应该“获胜”。如果您的意思是您只想从parentList1 添加parentList2 中不存在的父母,那么您可以简单地执行AddRange,在其中添加名称在parentList2 中不存在的父母:

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

之所以存在歧义,是因为您的示例适用于这两种情况。如果您包含一个排除其中之一的示例会更好(例如,如果parentList1 中的Parent 1 有一个名为Child 9 的孩子...该孩子是否存在于最终合并中?)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多