2012-10-19 178 views
0

在下面的代碼中,我使用foreach循環來檢查nodelist中的每個節點並刪除其中的一些節點。 我刪除了一個節點後,foreach循環出現以下錯誤: 「元素列表已更改,枚舉操作無法繼續」。 我該如何避免它?如何在foreach循環中刪除xmlnode?

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; 
     } 

回答

2

如果你還沒有根本消除從你遍歷集合的項目,我不知道,如果「使用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; 
} 
0

使用for循環,而不是從

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

對於每個用於枚舉和枚舉,而在列表中,您不能刪除。此外,循環必須從最後一個元素開始,以避免在刪除元素時發生任何移位。

4

不幸的是,答案是不使用foreach,而是在非常防彈的「for()」上回退。

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

在這種情況下,我在集合中向後循環,並一次刪除一個對象。這樣,我永遠不會有一個無效的索引。

+0

感謝您的回答。這個方法引發了另一個問題,現在當我刪除一個節點時,它也刪除了它的所有子節點,這可能是一個問題。 –

+0

當然,你必須適應你的需要,並把你想要的條件放在那裏。我編寫的例子只是爲了展示如何在for循環中編輯集合,而在foreach中編輯集合不起作用。如果刪除一個節點也刪除了它的所有子節點,那麼它將使用任何解決方案來完成它。這取決於你想要對子女做什麼。你是否想重新將它們添加到你正在解析的集合中,就像你只是在拼湊一個hiearchy? – LightStriker

+0

我需要保留一些sub childer在同一個節點列表中,以便以後我可以提取元素值和路徑供以後使用。 我想刪除其他元素而不是創建新列表的原因是,在新列表中,我將失去元素的原始xpath。 –

0

您不得更改在迭代過程中使用的集合。您可以使用For..loop代替

for(int i=0; i<nodeList.Length; i++) 
{ 
    //remove nodeList[i]; 
}