Question

Le code suivant ne compile pas

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

Il est supposé supprimer tout enfant immédiat du nœud racine ayant un attribut appelé nom dont la valeur est Non répertoriée dans le tableau de base BasicGroups.

Quelle est la syntaxe correcte pour cette tâche?

Était-ce utile?

La solution

Vous voulez probablement déplacer la partie "pas". Par exemple (code pseudo)

where (not (list.Contains(foo))

Autres conseils

Si l'attribut Name des nœuds à supprimer peut être mis en correspondance à l'aide d'un modèle simple, les opérations suivantes devraient fonctionner:

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

Notez l'utilisation de ToArray () dans l'énumération de NodesToRemove: vous en aurez besoin pour forcer l'évaluation de XQuery avant de commencer à modifier la collection sur laquelle il repose.

Si cela ne fonctionne pas, voici une alternative à LINQ (à l'origine, je pensais que l'insertion de "non" dans les requêtes LINQ ne fonctionnerait pas, mais une autre réponse m'a immédiatement mis en place: vous apprenez quelque chose de nouveau chaque jour ...):

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

Les performances doivent être pratiquement identiques à l'utilisation de LINQ.

Peut-être pouvez-vous essayer quelque chose comme ceci

mylistWithOutUndesirebleNodes = (de b dans NodeLists.Cast ()    où (de c dans NodesToDeleteList.Cast ()           où c.Attributes ["atributo"]. Value == b.Attributes ["atributo"]. Value           sélectionnez c) .Count () == 0  sélectionnez b) .ToList ();

Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
                    Where Not BasicGroups.Contains(Element.@Name)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top