我正在尝试迭代一个只包含父ID及其子代的列表,如下所示。
A
C
Ĵ
此树可以是任何深度,可以有多个父对象。 这个列表在我手中,我想像查找列表一样使用它。我将迭代它并更新现有的树。在更新这些对象时,我还想更新所有节点的深度和位置。 节点对象如下所示
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);
}
}
}
有什么建议吗? 感谢。
答案 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);