【问题标题】:Sort list into children using linq使用 linq 将列表排序为子项
【发布时间】:2017-01-08 05:24:09
【问题描述】:

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

var sortedList = marketItems.GroupBy(p => p.parentId).Select(grp => grp.ToList()).ToList();

但这只会将它们分组,我还不熟悉 linq 并且无法弄清楚如何正确映射孩子。 null ParentGroup 是树的顶层。任何对 linq 有更多经验的人都可以提供一些关于如何正确分组 llist 的想法。

 public JsonResult GetJsTree3Data()
    {
        var marketItems = new List<JsTree3Node>();
        var itemList = new List<JsTree3Node>();

        foreach (var group in GenerateGroups(connString))
        {
            var node = JsTree3Node.NewNode(group.id_str);
            node.text = group.name;
            node.state = new State(false, false, false);
            node.parentId = group.marketParentGroup;
            marketItems.Add(node);
        }

        foreach (var group in GenerateItems(connString))
        {
            var node = JsTree3Node.NewNode(group.id_str);
            node.text = group.name;
            node.state = new State(false, false, false);
            node.parentId = group.marketParentGroup;
            marketItems.Add(node);
        }

        // Create our root node and ensure it is opened
        var root = new JsTree3Node()
        {
            id = "0",
            text = "Market Items",
            state = new State(true, false, false)
        };

        var sortedList = marketItems.GroupBy(u => u.parentId).Select(grp => grp.ToList()).ToList();


        root.children = sortedList;

        return Json(root, JsonRequestBehavior.AllowGet);
    }

我尝试获得的最终结果是用户可以从中选择的项目树。树只有一层,因为子节点在排序列表中没有排序

【问题讨论】:

  • 我不清楚您要做什么。什么是父组 2?是否有一些标识符表示,例如,什么项目是项目 ID 2157(结构修改,父组 2)的父项?你的数据没有显示任何可以让我得出结论的东西。
  • 所以最终目标是列出父/子对?
  • 您想分别对每个父母下的孩子列表进行排序吗?它们应该按名称排序?
  • 能否提供一些父子数据?回答起来可能会更清楚
  • 您需要提供minimal reproducible example。诸如可编译的类定义、示例数据、预期输出等。

标签: c# linq list sorting


【解决方案1】:

我明白了,父母可以包含多个项目:我相信这就是你要找的:

            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 循环。

【讨论】:

  • 我不确定您的最终数据格式是什么。这会将您的项目分组,然后按其 parentGroup 的顺序访问它们。您可以从中构建您想要的任何数据结构...
【解决方案2】:

我不确定您的最终目标是什么,但我不确定您尝试做的事情是否可以通过一次 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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2010-09-29
    • 2011-09-13
    相关资源
    最近更新 更多