WP7 -删除多个项目Linq到XML
本文关键字:Linq XML 项目 删除 WP7 | 更新日期: 2023-09-27 18:07:04
我需要从我的XML文件中删除所有项目,其中节点Finished != ""
,但我的代码只删除第一个项目,其中此条件为真
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();
,它会显示我多次消息框,因为它是正确的。
我的代码有什么问题?
当您搜索项目时,您应该调用ToList()
,然后使用该列表作为foreach
循环的源,而不是IEnumerable
。
var tasks = (from task in xElem.Elements("Task")
where (string)task.Element("Finished") != ""
select task).ToList();
它在MSDN中被描述,在XNode.Remove
方法描述中:
在LINQ to XML编程中,不应该操作或修改集合在查询该集合中的节点时。在实际换句话说,这意味着不应该迭代一组节点和删除它们。相反,您应该将它们具体化到List by中使用ToList扩展方法。然后,你可以迭代删除节点的列表。有关更多信息,请参见混合声明性代码/命令式代码bug (c#) (LINQ to XML)。