从具有位置和深度参数的对象列表创建多个父层次结构树
Creating multiple parent hierarchy tree from a list of objects with position and depth parameters
我正在尝试迭代一个仅包含父 ID 及其子 ID 的列表,如下所示。
一个
- B
C
- D
- E
G
- H
J
- K
这棵树可以是任意深度并且可以有多个父对象。
这个列表在我手上,我想像查找列表一样使用它。我将对其进行迭代并更新现有的树。在更新这些对象时,我还想更新所有节点的深度和位置。
节点对象如下
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);
我正在尝试迭代一个仅包含父 ID 及其子 ID 的列表,如下所示。
一个
- B
C
- D
- E
G
- H
J
- K
这棵树可以是任意深度并且可以有多个父对象。 这个列表在我手上,我想像查找列表一样使用它。我将对其进行迭代并更新现有的树。在更新这些对象时,我还想更新所有节点的深度和位置。 节点对象如下
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);