XElement.Remove (XNode.Remove) не работает - PullRequest
2 голосов
/ 10 октября 2011

Я пытаюсь удалить отдельные узлы от их родителя, я попробовал метод Remove, но он, похоже, не работает.Как это сделать?Это ошибка или что?

Sub Main()
  Dim xml =
    <?xml version="1.0" encoding="utf-8"?>
    <Products>
      <Product name="ABC-1" link="http://www.site.com/1"/>
      <Product name="ABC-2" link="http://www.site.com/2"/>
      <Product name="ABC-3" link="http://www.site.com/3"/>
    </Products>

  Dim products = xml.Root.<Product>

  'works - uncomment
  'products.Remove()

  'Doesn't work
  For Each product In products
    product.Remove()
  Next

  xml.Save(FailedFilename)
End Sub

1 Ответ

1 голос
/ 11 октября 2011

Удаление узлов в цикле по products вызывает его изменение. Поскольку это IEnumerable<XElement>, вам нужно избегать ленивых вычислений, чтобы обработать весь результат сразу. Для этого просто добавьте вызов к ToArray() или ToList():

For Each product In products.ToArray()
    product.Remove()
Next

Обратите внимание, что приведенный выше код соответствует следующему фрагменту. Это не то же самое, что добавление ToArray() при объявлении переменной products:

Dim temp = products.ToArray()
For Each product In temp
    product.Remove()
Next

Проблема, с которой вы столкнулись, кратко изложена на этой странице MSDN: Смешанные ошибки декларативного кода / императивного кода , в частности, раздел под заголовком «Удаление во время итерации».

Если вам не нужно работать с каждым product до его удаления, первый подход с использованием Remove метода расширения намного проще: products.Remove().

...