C# 反转LINQ中的嵌套集合
有一个类型a的列表,每个都包含一个类型B的列表,获得所有类型B的列表的最佳方法是什么,每个类型B都包含它们所属的类型a的列表 具有如下列表:C# 反转LINQ中的嵌套集合,c#,linq,C#,Linq,有一个类型a的列表,每个都包含一个类型B的列表,获得所有类型B的列表的最佳方法是什么,每个类型B都包含它们所属的类型a的列表 具有如下列表: var parents = new List<Parent> { { new Parent { ID = 1, Childs = new List<Child> { { new Child
var parents = new List<Parent> {
{
new Parent {
ID = 1,
Childs = new List<Child> {
{
new Child {
ID = 1
}
},
{
new Child {
ID = 2
}
},
{
new Child {
ID = 3
}
}
}
}
},
{
new Parent {
ID = 2,
Childs = new List<Child> {
{
new Child {
ID = 3
}
},
{
new Child {
ID = 4
}
},
{
new Child {
ID = 5
}
}
}
}
}
};
编辑:我尝试了一种方法,首先使用SelectMany
和Distinct
将孩子展平,但不确定如何再次将其链接到家长:
var foo =
from childId in parents.SelectMany(x => x.Childs).Select(x => x.ID).Distinct()
select
new
{
childId = childId,
inParent = // Missing Part
};
您可以将大问题分为两个更简单的问题:
from
子句的简单LINQ查询groupby
子句是您在这里的朋友我想,如果您希望存储树状结构,您应该尝试更改数据模型,在这种情况下,您应该始终使用带有自定义对象的单链表,并以类似于存储在数据库中的方式嵌套引用相应的父/子对象
这是处理此类数据结构的理想方法,否则将导致许多嵌套查询。您必须先使用
选择many
将其展平,然后使用GroupBy
按子id和字符串分组。连接以连接每个父id:
var childParents = parents
.SelectMany(p => p.Childs.Select(c => new {Parent = p, Child = c}))
.GroupBy(x => x.Child.ID)
.Select(g => new
{
Child = g.Key,
InParent = String.Join(", ", g.Select(x => x.Parent.ID))
});
结果:
如果您确实不希望InParent
属性是一个字符串,而是一个列表(或数组),请使用以下命令:
.....
InParent = g.Select(x => x.Parent.ID).ToList() // or ToArray()
问问题之前你试过什么吗?你的问题是什么?当然,我尝试用SelectMany/Distinct将孩子们展平,它返回所有相关孩子的独特列表,但与他们所属的家长没有联系。当然,我可以通过循环进行迭代,我的问题是如何在LINQ查询中实现这一点。
.....
InParent = g.Select(x => x.Parent.ID).ToList() // or ToArray()