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();,它会显示我多次消息框,因为它是正确的。

我的代码有什么问题?

WP7 -删除多个项目Linq到XML

当您搜索项目时,您应该调用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)。