从具有位置和深度参数的对象列表创建多个父层次结构树

Creating multiple parent hierarchy tree from a list of objects with position and depth parameters

我正在尝试迭代一个仅包含父 ID 及其子 ID 的列表,如下所示。

一个

G

这棵树可以是任意深度并且可以有多个父对象。 这个列表在我手上,我想像查找列表一样使用它。我将对其进行迭代并更新现有的树。在更新这些对象时,我还想更新所有节点的深度和位置。 节点对象如下

public Node node
{
   Id
   List<Node> Children
}

总而言之,我想通过递归遍历我的查找列表来更新我现有的树。此外,我正在使用 jstree 并将树的最后状态作为 json 发送到服务器,因此我想用新的 json 结果更新我现有的树。我所做的如下所示,尽管它提供了父子关系,但它不会更新深度和位置属性。

 private void TreeRecursively(Tree[] list)
        {
            var orderNum = 0;
            var depth = 0;

            foreach (var category in list)
            {
                var cat = db.Get(category.id.Value);
                cat.OrderNumber = orderNum;
                cat.Depth = depth;
                db.Update(cat);

                orderNum++;
                depth++;

                if (category.children.Any())
                {
                    var childOrderNum = 0;
                    foreach (var child in category.children)
                    {
                        var childCat = db.Get(child.id.Value);

                        childCat.OrderNumber = childOrderNum;
                        childCat.Parent = cat;
                        childCat.Depth = cat.Depth + 1;
                        db.Update(childCat); 
                        childOrderNum++;
                    }
                    TreeRecursively(category.children);
                }
            }
        }

有什么建议吗? 谢谢

我刚刚通过清醒的思考解决了这个问题,我更新了我的代码,如下所示。希望它能帮助别人。 保重。

   private void UpdateCategoryRecursively(IList<JsonTreeDto> list, 
int depth, int pOrderNumber, Category parent = null)
            {
                foreach (var category in list)
                {
                    var pCategory = _categoryRepository.Get(category.id.Value);

                    pCategory.Parent = parent;
                    pCategory.Depth = depth;
                    pCategory.OrderNumber = pOrderNumber;
                    pCategory.OrderCode = CategoryHelper.CrateHierarchyOrderCode(depth, pOrderNumber);
                    _categoryRepository.Update(pCategory);

                    if (category.children != null && category.children.Any())
                    {
                        int childOrderNumber = 0;
                        foreach (var child in category.children)
                        {
                            var cCategory = _categoryRepository.Get(child.id.Value);

                            cCategory.Parent = pCategory;
                            cCategory.Depth = pCategory.Depth + 1;
                            cCategory.OrderNumber = childOrderNumber;
                            cCategory.OrderCode = CategoryHelper.CrateHierarchyOrderCode(pCategory.Depth + 1, childOrderNumber);
                            _categoryRepository.Update(cCategory);
                            childOrderNumber++;

                            UpdateCategoryRecursively(child.children, cCategory.Depth + 1, 0, cCategory);
                        }
                    }
                    pOrderNumber++;
                }
            }

像follow一样称呼即可; UpdateCategoryRecursively(yourTree, 0, 0);