Linq to XML 'Where not in'语法问题



以下代码不编译

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)

相关内容

  • 没有找到相关文章

最新更新