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が変更され、2つのElements( "x")があり、最初の要素が削除された場合、ループが2番目の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

foreach の代わりに for なしで試してみてください。

于 2009-10-07T16:53:31.510 に答える