C# 使用linq将列表排序为子级

C# 使用linq将列表排序为子级,c#,linq,list,sorting,C#,Linq,List,Sorting,我正在尝试使用Linq从13883个对象的大列表中创建一棵树,将对象排序到它们的父组和子组中,每个对象都与parentId关联,我可以使用 var sortedList = marketItems.GroupBy(p => p.parentId).Select(grp => grp.ToList()).ToList(); 但这只是把他们分成几个小组,我对linq还不太熟悉,也不知道如何正确地绘制孩子们的地图。null ParentGroup是树的顶层。任何对linq有更多经验的人都

我正在尝试使用Linq从13883个对象的大列表中创建一棵树,将对象排序到它们的父组和子组中,每个对象都与parentId关联,我可以使用

var sortedList = marketItems.GroupBy(p => p.parentId).Select(grp => grp.ToList()).ToList();
但这只是把他们分成几个小组,我对linq还不太熟悉,也不知道如何正确地绘制孩子们的地图。null ParentGroup是树的顶层。任何对linq有更多经验的人都可以提供一些关于如何正确分组llist的想法

publicjsonresult GetJsTree3Data()
{
var marketItems=新列表();
var itemList=新列表();
foreach(发电机组中的var组(connString))
{
var node=JsTree3Node.NewNode(group.id\u str);
node.text=group.name;
node.state=新状态(false,false,false);
node.parentId=group.marketParentGroup;
marketItems.Add(节点);
}
foreach(GenerateItems中的var组(connString))
{
var node=JsTree3Node.NewNode(group.id\u str);
node.text=group.name;
node.state=新状态(false,false,false);
node.parentId=group.marketParentGroup;
marketItems.Add(节点);
}
//创建根节点并确保它已打开
var root=new JsTree3Node()
{
id=“0”,
text=“市场项目”,
状态=新状态(真、假、假)
};
var sortedList=marketItems.GroupBy(u=>u.parentId).Select(grp=>grp.ToList()).ToList();
root.children=sortedList;
返回Json(root,JsonRequestBehavior.AllowGet);
}
我尝试实现的最终结果是一个项目树,用户可以从中选择。树只有一个级别,因为子级在排序列表中没有排序


我不确定你的最终目标是什么,但我不确定你想做的事情是否可以通过一次LINQ传球严格完成。不过,如果可能的话,我想这会很复杂。不过,您可以在两个LINQ查询中非常简单地实现这一点:

var refDict = marketItems.ToDictionary(k => k.Id, v => v);
var groupedList = marketItems.Select(s => 
                new 
                { 
                    Parent = s.ParentGroup == null ? null : refDict[s.ParentGroup],
                    Child = s
                }).ToList();
然后像这样使用它:

var parent = groupedList[0].Parent;
var child = groupedList[0].Child;

不过,老实说,您可以只使用第一行代码,然后在需要时自己查询字典以查找对象的父对象。

我明白了,父对象可以包含多个项:我相信这就是您要查找的:

            var sortedList = from p in marketItems
                             group p by p.ParentGroup into Groups
                             select Groups;
            //to access the items in each group individually
            foreach (var grouping in sortedList)
            {
                foreach (var Item in grouping)
                {
                    Item.Description///you can access the individual items from this layer...
                }
            }

您的代码应该这样做,但要访问分组项,您需要使用嵌套的foreach循环。

我不清楚您要做什么。什么是父组2?是否存在一些标识符,例如,哪个项目是项目Id 2157(结构修改,父组2)的父项?您的数据没有显示任何可以让我推导的内容。所以最终目标是列出一个父/子对列表?您想分别对每个父/子对下的子项列表进行排序吗?它们应该按名称排序?您能提供一些父项和子项数据吗?答案可能更清楚,你需要提供一个答案。诸如可编译类定义、示例数据、预期输出等。我不确定最终数据格式是什么。这将对项目进行分组,然后按其父组的顺序访问它们。您可以从中构建任何您想要的数据结构。。。
            var sortedList = from p in marketItems
                             group p by p.ParentGroup into Groups
                             select Groups;
            //to access the items in each group individually
            foreach (var grouping in sortedList)
            {
                foreach (var Item in grouping)
                {
                    Item.Description///you can access the individual items from this layer...
                }
            }