0

次のコードはコンパイルされません

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

BasicGroupsStringArrayに値がリストされていないnameという属性を持つrootnodeのImmediate子を削除することになっています。

このタスクの正しい構文は何ですか?

4

4 に答える 4

3

おそらく、'not' の部分を動かしたいと思うでしょう。例 (疑似コード)

where (not (list.Contains(foo))
于 2008-10-21T12:05:26.673 に答える
1

削除するノードの 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 の評価を強制するために必要です。

これが機能しない場合は、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 を使用する場合とほぼ同じです。

于 2008-10-21T12:07:23.563 に答える
0
Dim NodesToRemove = From Element In SchemaDoc.Root.<Group> _
                    Where Not BasicGroups.Contains(Element.@Name)
于 2009-07-29T22:24:31.157 に答える
0

多分あなたはこのようなことを試すことができます

mylistWithOutUndesirebleNodes = (NodeLists.Cast() の b から) where (NodesToDeleteList.Cast() の c から c.Attributes["atributo"].Value == b.Attributes["atributo"].Value を選択 c).Count( ) == 0 選択 b).ToList();

于 2009-07-29T21:59:57.270 に答える