1

私のlinqtoxml 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

私のlinqtoxml 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 に答える