как удалить xmlnode внутри цикла foreach?

В следующем коде я использую цикл 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)

Решение Вопроса

над которой зацикливаетесь, я не уверен, будет ли работать «использовать цикл 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;
}

ответ заключается не в том, чтобы использовать foreach, а в том, чтобы использовать «пуленепробиваемый» метод for ().

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

В этом случае я возвращаюсь назад в коллекции и удаляю по одному объекту за раз. Таким образом, у меня никогда не будет неверного индекса.

 LightStriker20 окт. 2012 г., 14:52
Конечно, вы должны адаптировать его к вашим потребностям и поставить там условия, которые вы хотите. Пример, который я написал, был только для того, чтобы показать, как я могу редактировать коллекцию в цикле for, в то время как редактирование в foreach не работает. Если удаление узла удаляет также все его дочерние элементы, то он сделал бы это с любым решением. Это зависит от того, что вы хотите сделать с детьми. Вы хотите снова добавить их в коллекцию, которую анализировали, как если бы вы только рухнули?
 Avi.S.20 окт. 2012 г., 23:39
Мне нужно сохранить некоторые подпрограммы в том же списке узлов, чтобы позже я мог извлечь значение элемента и путь для последующего использования. причина, по которой я хочу удалить другие элементы, а не создавать новый список, заключается в том, что в новом списке я потеряю исходный xpath элементов.
 Avi.S.20 окт. 2012 г., 12:30
Спасибо за ответ. этот метод вызывает другую проблему, теперь, когда я удалил узел, он также удаляет все его дочерние узлы, и это может быть проблемой.

использованную во времяforeach итерация. Вы можете использоватьFor..loop вместо

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

Используйте для цикла вместо

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

Для каждого используется для перечисления, и вы не можете удалить при перечислении списка. Также цикл должен начинаться с последнего элемента, чтобы избежать смещения при удалении элемента.

Ваш ответ на вопрос