我是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();
这似乎可以使“父级”列表正常,但似乎无法同步子级数据...
答案 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
的孩子...该孩子将存在于最终合并中吗?还是不?)。