2012-10-16 42 views
1

我的LINQ到XML的foreach循環是提前和意外終止。沒有例外。這是怎麼回事?Linq到XML爲循環終止早期和意外


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> 

回答

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")); 
}