在foreach循环中删除XElements

时间:2009-10-07 16:47:51

标签: .net c#-3.0 foreach xelement

所以,我有一个要移除的错误

foreach (XElement x in items.Elements("x")) 
{
    XElement result = webservice.method(x);

    if (/*condition based on values in result*/) 
    {
        x.Remove();
    }
}

问题在于调用x.Remove()会改变foreach,如果有两个元素(“x”),并且第一个被删除,则循环不会到达第二个x元素。

那么我该如何循环呢?或者是否应该以另一种方式重写?

3 个答案:

答案 0 :(得分:31)

我怀疑Linq可以帮助你,如下所示。

using System.Linq;

void foo()
{
    items.Elements("x")
         .Where(x => condition(webservice.method(x)))
         .Remove();
}

如果这不起作用(即内部枚举器仍然无效),请对所选元素进行浅表复制并按如下方式删除它们。

using System.Linq;

void foo()
{
    List xElements = items.Elements("x")
                          .Where(x => condition(webservice.method(x)))
                          .ToList();

    for (int i = xElements.Count - 1; i > -1; i--)
    {
        xElements[i].Remove();
    }
}

答案 1 :(得分:1)

在循环逻辑之前创建一个集合,将要删除的元素添加到新集合中,然后调用items.Remove对新集合中的每个元素。

答案 2 :(得分:1)

尝试不使用for而不是foreach。