2013-04-02 3 views
0

Мне нужно удалить все элементы из моего файла XML, где узел Finished != "", но мой код удалить только первый пункт, где это условие истинноWP7 - Удалить несколько элементов Linq для 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(); 
} 

Но если я заменил task.Remove(); на MessageBox, он показывает мне окно с сообщением несколько раз, так как это правильно.

Что не так в моем коде?

ответ

2

Вы должны позвонить ToList() при поиске элементов, а затем использовать этот список в качестве источника в foreach loop, а не IEnumerable.

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

Это описано в MSDN, в описании XNode.Remove метода:

В LINQ программирования XML, вы не должны манипулировать или изменить набор узлов в то время как вы запрашиваете для узлов в этом наборе. В практических условиях это означает, что вы не должны перебирать множество узлов и удалите их. Вместо этого вы должны материализовать их в список по с использованием метода расширения ToList. Затем вы можете перебрать список, чтобы удалить узлы. Для получения дополнительной информации см. Смешанные Ошибки декларативного кода/императивного кода (C#) (LINQ to XML).

Смежные вопросы