2013-04-02 26 views
0

我需要刪除從我的XML文件中的所有項目,其中節點Finished != ""但我的代碼只刪除第一個項目,其中該條件爲真WP7 - 刪除多個項目的LINQ to XML

我的代碼:

try 
{ 
    var file = IsolatedStorageFile.GetUserStoreForApplication(); 
    XElement xElem; 

    using (IsolatedStorageFileStream read = file.OpenFile("tasks.xml", FileMode.Open)) 
    { 
     xElem = XElement.Load(read); 
    } 

    var tasks = from task in xElem.Elements("Task") 
       where (string)task.Element("Finished") != "" 
       select task; 

    using (IsolatedStorageFileStream write = file.CreateFile("tasks.xml")) 
    { 
     foreach (XElement task in tasks) 
     { 
      task.Remove(); 
     } 

     xElem.Save(write); 
    } 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
finally 
{ 
    NavigationService.GoBack(); 
} 

但如果我用MessageBox替換task.Remove();,它會多次顯示消息框,因爲它是正確的。

我的代碼有什麼問題?

回答

2

當您搜索項目並在foreach循環中使用該列表作爲源時,應該調用ToList()而不是IEnumerable

var tasks = (from task in xElem.Elements("Task") 
      where (string)task.Element("Finished") != "" 
      select task).ToList(); 

它在MSDN描述,內XNode.Remove方法說明:

在LINQ to XML編程,你不應該操縱或您要查詢該組中的節點修改節點的集合 。在實際的 條款中,這意味着您不應該遍歷一組節點,並且 將它們移除。相反,您應該使用ToList擴展方法將它們實現爲列表 。然後,您可以遍歷列表中的 以刪除節點。有關更多信息,請參見混合 聲明性代碼/命令代碼錯誤(C#)(LINQ to XML)。