C# GroupBy并选择新集合(父集合)中的新集合(子集合)

C# GroupBy并选择新集合(父集合)中的新集合(子集合),c#,linq,C#,Linq,数据: var组=新列表() { 新组 { id=10, parentId=1, groupName=“一”, childName=“w1” }, 新组 { id=20, parentId=1, groupName=“两个”, childName=“w2” }, 新组 { id=30, parentId=2, groupName=“三”, childName=“w3” }, 新组 { id=40, parentId=2, groupName=“四”, childName=“w4” } }; 预

数据:

var组=新列表()
{
新组
{
id=10,
parentId=1,
groupName=“一”,
childName=“w1”
},
新组
{
id=20,
parentId=1,
groupName=“两个”,
childName=“w2”
},
新组
{
id=30,
parentId=2,
groupName=“三”,
childName=“w3”
},
新组
{
id=40,
parentId=2,
groupName=“四”,
childName=“w4”
}
};
预期结果:

class ChildGroup
{
    public int parentId;
    public string groupName;
    public List<Child> childs;
}

class Child
{
    public int id;
    public string childName;
}
class子组
{
公共int-parentId;
公共字符串组名;
公开名单儿童;
}
班童
{
公共int id;
公共字符串childName;
}
我尝试按parentId分组,然后创建新的集合ChildGroups,它将包含:parentId、groupName和Childs集合在每个ChildGroups中

尝试:

var result=groups.GroupBy(g=>g.parentId).Distinct();
List List=dd.Select(o=>
新儿童组
{
groupName=o。
}).ToList();
试图从“o”中的组中获取属性,但未看到。
我的错在哪里?

你可以用这样一句话来实现这一点:

var shaped=groups.GroupBy(g=>new{g.id,g.groupName})//GroupBy同时使用组的id和名称,因此它们是键的一部分
.Select(g=>newchildgroup{//将对象塑造成子组
parentId=g.Key.id,//从键分配id
groupName=g.Key.groupName,//从键中分配组名
childs=g.Select(gc=>newchild{//遍历分组的集合以构建子集合。
id=gc.id,//从分组的集合中分配子项的id。
childName=gc.childName//从分组的集合中分配子对象的childName。
}).ToList()//强制转换为列表以符合模型。
});
也可以通过使用
GroupBy
重载方法之一来消除其中一个选择:

groups.GroupBy(g=>new{g.id,g.groupName},
(键,c)=>新建子组{
parentId=key.id,
groupName=key.groupName,
childs=c.Select(gc=>newchild{
id=gc.id,
childName=gc.childName
})托利斯先生()
});

基本上,我们必须按parentId进行分组,parentId将是关键,组的内容是投影中任何值的列表

var result = groups.GroupBy(g => g.parentId, (key, p) => new {groups = p.ToList(), parentId = key});

您还可以分享组模型,以及
dd
变量的代码吗?变量“dd”与“result”相同。您能详细说明一下您的答案吗?也许通过解释你的代码。谢谢@20更正的密钥并添加了小说明