作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试遍历 DOM 树,使用 AngleSharp
HTML 解析器替换和删除节点。这个问题不是这个库独有的,而是一个关于如何递归地改变树并确保我仍然遍历整棵树的一般问题。
以这个列表 myCollection
为例,其中每个条目都是一个节点对象,可能带有子对象。这也是一个现场收藏:
-A
-B
-C
--D
--E
--F
-G
我开始循环递归函数:
private void LoopRecursively(Node element) {
//either do nothing, remove, or replace with children
//e.g. element.Replace(element.ChildNodes);
for (var x = 0; x < element.ChildNodes.Length; x++) {
LoopRecursively(element.ChildNodes[x]);
}
}
假设我们决定用它的子节点替换 C
节点,因此列表变为:
-A
-B
-D
-E
-F
-G
问题是递归会出错。现在有比 for 循环中的 Length
多的节点,因此并非所有项目都将被递归。同样,删除节点意味着跳过列表中向上移动的节点。
我如何递归可能因递归处理而发生变化的树?是否一遍又一遍地递归我的列表,直到我确定没有任何更改是唯一的方法,或者我是否错误地解决了问题?
最佳答案
安全的方法:使用递归函数创建一棵全新的树而不是改变旧树,然后用新树替换旧树。
不太安全的方法:让您的 LoopRecursively 函数返回一个整数,表示添加或删除的节点数,然后用这个新数字更新循环变量。 (更新循环索引和循环条件中的变量)
关于c# - 如何递归遍历遍历过程中发生变化的树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31996123/
我是一名优秀的程序员,十分优秀!