Вам придется пропустить отложенное выполнение с помощью вызова ToList, что, вероятно, не повлияет на вашу производительность в больших документах, так как вы просто собираетесь выполнять итерации и замену с гораздо меньшим значением big-O, чем оригинал поиск. Как указал @jacob_c, я должен использовать element.Nodes () для его правильной замены, и, как указал @Panos, я должен перевернуть список, чтобы точно обрабатывать вложенные замены.
Кроме того, используйте XElement.ReplaceWith , намного быстрее, чем ваш текущий подход в больших документах:
var elements = doc.Descendants("RemovalTarget").ToList().Reverse();
/* reverse on the IList<T> may be faster than Reverse on the IEnumerable<T>,
* needs benchmarking, but can't be any slower
*/
foreach (var element in elements) {
element.ReplaceWith(element.Nodes());
}
И последнее замечание: при рассмотрении того, для чего МОЖЕТ быть использовано, я склонен согласиться с @Trull, что XSLT может быть тем, что вы на самом деле ищете, если, скажем, вы удаляете все теги скажем из документа , В противном случае, наслаждайтесь этой довольно приличной и довольно хорошо работающей реализацией LINQ to XML.