0

以下代码无法编译

Dim BasicGroups As String() = New String() {"Node1", "Node2"}
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
                    Where Element.@Name not in BasicGroups
For Each XNode In NodesToRemove
    XNode.Remove()
Next

它应该删除根节点的任何直接子节点,该子节点具有名为 name 的属性,其值在 BasicGroups StringArray 中列出。

此任务的正确语法是什么?

4

4 回答 4

3

您可能想要移动“不”部分。例如(伪代码)

where (not (list.Contains(foo))
于 2008-10-21T12:05:26.673 回答
1

如果要删除的节点的 Name 属性可以使用简单的模式进行匹配,则以下内容应该有效:

Dim SchemaDoc As New XDocument(<Root><Group Name="Foo"/><Group Name="Node1"/>
                           <Group Name="Node2"/><Group name="Bar"/></Root>)
Dim NodesToRemove = From Element In SchemaDoc.<Root>.<Group> Where _
                           Element.@Name Like "NotNode?"
For Each XNode In NodesToRemove.ToArray()
  XNode.Remove()
Next

请注意在 NodesToRemove 枚举中使用 ToArray():在开始修改它所基于的集合之前,您需要它来强制评估 XQuery。

如果这不起作用,这里是使用 LINQ 的替代方法(因为最初我认为在 LINQ 查询中插入'not'是行不通的,但我被另一个答案直接设置了——你每天都会学到新东西...... ):

Dim NodesToRemove As New Collections.ObjectModel.Collection(Of XNode)
For Each Element In SchemaDoc.<Root>.<Group>
  If Not BasicGroups.Contains(Element.@Name) Then
    NodesToRemove.Add(Element)
  End If
Next

性能应该与使用 LINQ 几乎相同。

于 2008-10-21T12:07:23.563 回答
0

也许你可以尝试这样的事情

mylistWithOutUndesirebleNodes = (from b in NodeLists.Cast() where (from c in NodesToDeleteList.Cast() where c.Attributes["atributo"].Value == b.Attributes["atributo"].Value select c).Count( ) == 0 选择 b).ToList();

于 2009-07-29T21:59:57.270 回答
0
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
                    Where Not BasicGroups.Contains(Element.@Name)
于 2009-07-29T22:24:31.157 回答