以下代码不编译
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的属性,该属性的值为Not,列在BasicGroups StringArray中。
此任务的正确语法是什么
您可能想要移动'not'部分。例如(伪码)
where (not (list.Contains(foo))
如果要删除的节点的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所基于的集合之前,您需要强制评估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基本相同。
也许你可以试试这个
mylistWithOutUndesirebleNodes=(来自NodeLists.Cast()中的b其中(来自NodesToDeleteList.Cast()中的c其中c.Attributes["atributo"].Value=b.Attributes["atributo"].Value选择c).Count()==0选择b).ToList();
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
Where Not BasicGroups.Contains(Element.@Name)