1

我的 linq to xml foreach 循环提前意外终止。没有提出异常。这是怎么回事?


var doc = XDocument.Parse("<a><b>one</b><b>two</b></a>");

foreach(var element in doc.Root.Elements("b"))
{
 element.ReplaceWith(XElement.Parse("<c>fixed</c>"));
}

doc.Dump();

给我

<a>
  <c>fixed</c>
  <b>two</b>
</a>

当我期待

<a>
  <c>fixed</c>
  <c>fixed</c>
</a>
4

1 回答 1

6

我的 linq to xml foreach 循环提前意外终止。这是怎么回事?

当您在同一文档上迭代延迟评估的查询时,修改文档通常是一个坏主意。在某些情况下,它可能会起作用,但很难预测,而且我不知道这种行为是否被记录在案。(想象一下,如果评估持续到“当前”元素,并且每次都询问它的下一个兄弟元素 - 当元素从文档中删除时不会再有任何结果!)

如果您首先实现查询,则它可以正常工作:

foreach(var element in doc.Root.Elements("b").ToList())
{
    // Removed the pointless XElement.Parse call; it's cleaner just to create
    // an element with the data you want.
    element.ReplaceWith(new XElement("c", "fixed"));
}
于 2012-10-16T13:14:46.767 回答