代码之家  ›  专栏  ›  技术社区  ›  CaffGeek

移除foreach循环中的Xelements

  •  23
  • CaffGeek  · 技术社区  · 15 年前

    所以,我有一个bug要移除

    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 回复  |  直到 7 年前
        1
  •  31
  •   Martin Schneider    7 年前

    我怀疑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();
        }
    }
    
        2
  •  1
  •   Tom Anderson    15 年前

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

        3
  •  1
  •   Xaisoft    15 年前

    试着不带for而不是foreach。