Pregunta

El siguiente código no se compila

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

Se supone que elimina cualquier hijo inmediato del nodo raíz que tiene un atributo llamado nombre cuyo valor es No incluido en el StringArray de BasicGroups.

¿Cuál es la sintaxis correcta para esta tarea?

¿Fue útil?

Solución

Probablemente quieras mover la parte 'no'. Por ejemplo (código psuedo)

where (not (list.Contains(foo))

Otros consejos

Si el atributo Nombre de los nodos que se eliminarán puede coincidir con un patrón simple, lo siguiente debería funcionar:

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

Tenga en cuenta el uso de ToArray () en la enumeración de NodesToRemove: lo necesitará para forzar la evaluación de XQuery antes de comenzar a modificar la colección en la que se basa.

Si esto no funciona, aquí hay una alternativa al uso de LINQ (ya que originalmente pensé que insertar 'no' en las consultas LINQ no funcionaría, pero otra respuesta me dejó claro: aprendes algo nuevo todos los días ...):

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

El rendimiento debería ser prácticamente idéntico al uso de LINQ.

Tal vez puedas probar algo como esto

mylistWithOutUndesirebleNodes = (desde b en NodeLists.Cast ()    donde (desde c en NodesToDeleteList.Cast ()           donde c.Atributos [" atributo "]. Value == b.Attributes [" atributo "]. Value           seleccione c) .Count () == 0  seleccione b) .ToList ();

Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
                    Where Not BasicGroups.Contains(Element.@Name)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top