2

在下面的代码中,我使用 foreach 循环检查节点列表中的每个节点并删除其中的一些。在我删除一个节点后,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);
}

在这种情况下,我在集合中向后循环,一次删除一个对象。这样,我永远不会有无效的索引。

于 2012-10-19T23:40:34.410 回答
4

由于您不是简单地从您循环的集合中删除项目,因此我不确定“使用 for 循环”是否有效。

下面分两个步骤:

  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

使用 for 循环代替

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

For each 用于枚举,枚举列表时不能删除。此外,循环必须从最后一个元素开始,以避免在删除元素时发生任何偏移。

于 2012-10-19T23:40:23.413 回答
0

我找到了一个替代方法:将 xmlnodelist 转换为 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 回答