Linq到XML的“Where not in”语法问题

Linq到XML的“Where not in”语法问题,linq,linq-to-xml,linq-to-objects,Linq,Linq To Xml,Linq To Objects,以下代码不编译 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() Nex

以下代码不编译

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中列出


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

您可能希望移动“not”部分。例如psuedo代码

where (not (list.Contains(foo))

您可能想移动“not”部分。例如psuedo代码

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
请注意ToArray在NodesToRemove枚举中的使用:在开始修改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几乎相同。

如果要删除的节点的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
请注意ToArray在NodesToRemove枚举中的使用:在开始修改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几乎相同。

也许您可以尝试类似的方法

MyListWithout不需要的节点= 从节点列表中的b开始 在NodesToDeleteList.Cast中的c中的位置 其中c.Attributes[atributo].Value==b.Attributes[atributo].Value 选择c。计数==0
选择b.ToList

也许你可以试试这样的东西

Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
                    Where Not BasicGroups.Contains(Element.@Name)
MyListWithout不需要的节点= 从节点列表中的b开始 在NodesToDeleteList.Cast中的c中的位置 其中c.Attributes[atributo].Value==b.Attributes[atributo].Value 选择c。计数==0
选择b.ToList

所以在我的例子中…..这里不是BasicGroups.containseElement.@Name。。。这很有效。。谢谢。很好,我对VB语法不太清楚:所以在我的例子中,…Where Not BasicGroups.containseElement@Name。。。这很有效。。谢谢。很好,我不确定VB语法:
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
                    Where Not BasicGroups.Contains(Element.@Name)