使用linq将列表排序为子项

时间:2017-01-08 05:24:10

标签: c# linq list sorting

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

将对象组合在一起
var sortedList = marketItems.GroupBy(p => p.parentId).Select(grp => grp.ToList()).ToList();

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

enter image description here

 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);
    }

我尝试的最终结果是用户可以选择的项目树。由于孩子在排序列表中没有排序,因此只有一个级别的树

enter image description here

2 个答案:

答案 0 :(得分:1)

我知道,父母可以包含多个项目:我相信这就是你要找的东西:

let dataFrame = //some R.data_frame
let e = REngine.GetInstance()
e.SetSymbol("dataFrame", dataFrame)
e.Evaluate("unique(dataFrame$some_column)").GetValue<double[]>()
e.Evaluate("dataFrame$new_column <- dataFrame$some_column * 1000")

您的代码应该执行此操作,但要访问分组项目,您需要使用嵌套的foreach循环。

答案 1 :(得分:0)

我不确定您的最终目标是什么,但我不确定您尝试做的事情是否可以通过一次LINQ传递严格完成。但是,如果可能的话,我想它会很复杂。不过,您可以非常简单地在两个LINQ查询中执行此操作:

StiReport

然后像这样使用它:

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();

但是,老实说,你可以保持自己的第一行代码,然后在你需要时自己查询一个对象的父级字典。