2

次のコードでは、foreach ループを使用して nodelist の各ノードをチェックし、それらの一部を削除します。1 つのノードを削除した後、foreach ループは次のエラーをスローします:「要素リストが変更されました。列挙操作を続行できませんでした」。どうすれば回避できますか?

public static XmlNodeList Scan(XmlNodeList nodeList)
        {
            string elementValue = null;
            foreach (XmlNode xmlElement in nodeList)
            {
                elementValue = xmlElement.InnerText;
                if (elementValue.Length >= 6 && elementValue.Substring(0, 3) == "999")
                {
                    continue;
                }
                else 
                {
                    XmlNode node = xmlElement.ParentNode;
                    node.RemoveChild(xmlElement);
                }
            }

            return nodeList;
        }
4

5 に答える 5

4

悲しいことに、答えは foreach を使用せず、非常に防弾の "for()" にフォールバックすることです。

for(int i = collection.Count - 1; i >= 0; i--)
{
    object myObject = collection[i];
    collection.Remove(myObject);
}

この場合、コレクション内を逆方向にループし、一度に 1 つのオブジェクトを削除します。そうすれば、無効なインデックスを持つことはできません。

于 2012-10-19T23:40:34.410 に答える
4

ループしているコレクションからアイテムを単純に削除するわけではないため、「for ループを使用する」が機能するかどうかはわかりません。

次の 2 つの手順を実行します。

  1. 親から切り離したいすべての要素の定期的なリストを作成します。
  2. これらの要素を親から切り離します - 通常のリストを反復することにより、切り離しの影響を受けません。
public static XmlNodeList Scan(XmlNodeList nodeList)
{
    List<XmlNode> toRemove = new List<XmlNode>();

    foreach (XmlNode xmlElement in nodeList)
    {
        string elementValue = xmlElement.InnerText;
        if (elementValue.Length < 6 || elementValue.Substring(0, 3) != "999")
        {
            toRemove.Add(xmlElement);
        }
    }

    foreach(XmlNode xmlElement in toRemove)
    {
        XmlNode node = xmlElement.ParentNode;
        node.RemoveChild(xmlElement);
    }

    return nodeList;
}
于 2012-10-20T00:06:16.133 に答える
0

from の代わりに for ループを使用する

for(I=length-1;I>=0;I--)

For each は列挙に使用され、リストの列挙中に削除することはできません。また、要素を削除するときのシフトを避けるために、ループは最後の要素から開始する必要があります。

于 2012-10-19T23:40:23.413 に答える
0

代わりの方法を見つけました: Convert xmlnodelist to list<>

XmlNodeListにはメソッドCastがあり、次のように使用できます。

var listOfNodes = new List<XmlNode>(xmlNodeList.Cast<XmlNode>());
于 2019-09-12T18:57:37.163 に答える
-1

foreach反復中に使用されるコレクションを変更することはできません。For..loop代わりに使用できます

for(int i=0; i<nodeList.Length; i++)
{
   //remove nodeList[i];
}
于 2012-10-19T23:43:54.413 に答える