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

时间:2015-01-23 21:03:23

标签: tree parent jstree children

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

A

  • C

    • d
    • 电子
  • ħ
  • Ĵ

    • ķ

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

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

有什么建议吗? 感谢。

1 个答案:

答案 0 :(得分:0)

我刚刚用清醒的头脑重新思考解决了这个问题,我更新了我的代码,如下所示。希望它可以帮助某人。 小心。

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

就像跟随它一样打电话;  UpdateCategoryRecursively(yourTree,0,0);