代码之家  ›  专栏  ›  技术社区  ›  Vibin Jith

我的递归函数工作不正常

  •  0
  • Vibin Jith  · 技术社区  · 16 年前

    有这样的XML文件。

    <?xml version ="1.0" encoding ="utf-8"?>
        <menu>
              <menuNode title="Register" value="true">
                <menuNode  title="Company"  value="false">
                  <menuNode title="Add" value="false" />
                  <menuNode title="Modify" value="false" />
                  <menuNode title="Delete" value="false" />
                </menuNode>
                <menuNode  title="SubCategory" value="true">
                  <menuNode title="Add" value="false" />
                  <menuNode title="Modify" value="false" />
                  <menuNode title="Delete" value="false" />
                </menuNode>
              <menuNode>   
         </menu>
    

    我要删除所有值为false的节点 我写了一个类似这样的递归函数,但它不能随意工作。

    Public Sub RemoveValueFalseNodes(ByVal MyMenuSource As XElement)
            For Each myMenuNode In MyMenuSource.Elements
                If myMenuNode.Elements.Count > 0 Then
                    RemoveValueFalseNodes(myMenuNode)
                End If
                If myMenuNode.Attribute("value").Value = "false" Then
                    myMenuNode.Remove()
                End If
            Next
        End Sub
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Josh    16 年前

    枚举集合时不应修改它。通常,当您尝试时,它会抛出一个异常,但有时它只是把结果搞砸了。相反,你应该考虑做如下的事情(为C感到抱歉,但我不太了解vb.net linq)

    var nodes = from x in MyMenuSource.Descendants("menuNode")
                where !(bool)x.Attribute("value")
                select x;
    
    foreach (var node in nodes.ToArray()) {
        node.Remove();
    }
    

    关于上面要注意的两件事——我使用Descendants()方法来避免对XML树进行递归挖掘。另外,我将集合转换为一个数组,该数组将获取结果的“快照”,以便在查询仍处于活动状态时删除元素不会干扰XML结构。

        2
  •  0
  •   AndiDog    16 年前

    在对数组进行迭代时,不要移除数组的元素,也不要采取适当的操作。在这种情况下,您应该简单地迭代 MyMenuSource.Elements 从后向前,所以删除元素不会在下一次迭代中造成麻烦。