質問

だから、私は削除するバグを持っている。

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

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

問題が)(x.Removeを呼び出すことが二つの要素は、(「X」)であり、最初に削除された場合、ループは第2のXエレメントに到達しないことをforeachのよう変化させることである。

それでは、どのように私はこれをループする必要がありますか?それとも、これは別の道を書き換えるべき?

役に立ちましたか?

解決

私は、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();
    }
}

他のヒント

新しいコレクション内の各要素に対してitems.Removeを呼び出して、新しいコレクションを削除する要素を追加し、ループロジックの前にコレクションを作成します。

の代わりにforeachののためにすることなく、それを試してみます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top