我正在尝试使用Linq从一个相当大的13883对象列表创建一个树,将对象排序到它们的父组和子组中,每个对象都与parentId相关联,我可以使用
将对象组合在一起var sortedList = marketItems.GroupBy(p => p.parentId).Select(grp => grp.ToList()).ToList();
但这只是将它们分组,我还不熟悉linq并且无法弄清楚如何正确映射孩子。 null ParentGroup是树的顶级。任何对linq有更多经验的人都能提供一些关于如何正确分组列表的想法。
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);
}
我尝试的最终结果是用户可以选择的项目树。由于孩子在排序列表中没有排序,因此只有一个级别的树
答案 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();
但是,老实说,你可以保持自己的第一行代码,然后在你需要时自己查询一个对象的父级字典。