4

考虑以下代码段

using System;
using System.Xml.Linq;

class Program
{
    static void Main()
    {
        var family = XDocument.Parse("<p><c><g/></c></p>");

        var usurper = family.Root.Descendants("g");
        family.Root.Element("c").Remove();
        family.Root.Add(usurper);

        Console.WriteLine(family.ToString());
        Console.ReadKey();
    }
}

我得到的输出是@"<p />",但我想要@"<p><g/></p>". 我可以理解它为什么会发生,并且它是正义的,但它不是我需要的输出。

如果我将行的顺序更改为

        var usurper = family.Root.Descendants("g");
        family.Root.Add(usurper);
        family.Root.Element("c").Remove();

建立了循环关系,并且 remove 最终会导致OutOfMemoryException

有没有一种简单、方便的方法来完成这项工作?

编辑

我实际实施的修复是

        var usurper = family.Root.Descendants("g").Single();
        family.Root.Element("c").Remove();
        family.Root.Add(usurper);

原谅我的脸红。

4

2 回答 2

5

尝试这样做

var usurper = family.Root.Descendants("g").ToList();

由于延迟评估,您必须强制枚举产生结果,否则您会得到一个空结果。

于 2012-05-15T16:16:11.810 回答
0

我相信您需要usurper.Remove()在将其添加到 Root 元素之前调用。如果没有这一步,篡位者将始终是“c”元素的后代,因此当“c”被删除时,篡位者也将如此。

于 2012-05-15T16:21:19.683 回答