23

所以,我有一个错误要删除

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

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

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

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

4

3 回答 3

32

我怀疑 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();
    }
}
于 2009-10-07T19:12:11.530 回答
1

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

于 2009-10-07T16:52:17.737 回答
1

尝试不使用 for 而不是 foreach。

于 2009-10-07T16:53:31.510 回答