在下面的代码中,我使用foreach循环检查nodelist中的每个节点并删除其中的一些节点。 删除一个节点后,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;
}
答案 0 :(得分:5)
可悲的是,答案是不使用foreach,而是使用非常防弹的“for()”。
for(int i = collection.Count - 1; i >= 0; i--)
{
object myObject = collection[i];
collection.Remove(myObject);
}
在这种情况下,我在集合中向后循环,并一次删除一个对象。这样,我永远不会有无效的索引。
答案 1 :(得分:2)
由于你不是简单地从集合中移除你正在循环的项目,我不确定“使用for循环”是否会起作用。
以下分为两步:
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;
}
答案 2 :(得分:0)
使用for循环代替
for(I=length-1;I>=0;I--)
每个用于枚举,枚举列表时无法删除。此外,循环必须从最后一个元素开始,以避免在删除元素时发生任何移位。
答案 3 :(得分:0)
不允许更改foreach
次迭代期间使用的集合。您可以使用For..loop
代替
for(int i=0; i<nodeList.Length; i++)
{
//remove nodeList[i];
}
答案 4 :(得分:0)
我找到了一个替代项:Convert xmlnodelist to list<>
XmlNodeList
具有方法Cast
,可以按以下方式使用:
var listOfNodes = new List<XmlNode>(xmlNodeList.Cast<XmlNode>());