Ошибка при вызове метода в foreach с объектом - PullRequest
0 голосов
/ 19 февраля 2011

У меня есть List с объектами строк и двойников, и я пытаюсь вызывать различные методы, основанные на типе элемента и их значении. В отладчике я вижу, что первая итерация работает нормально, но появляется ошибка при вводе во второй раз после вызова метода.
Если я закомментирую методы и добавлю простые методы, это работает, так что я понимаю, что это что-то с тем, как я вызываю методы.

Что я делаю не так, и что я могу сделать, чтобы это работало?
Если есть более простые способы сделать то, что я пытаюсь, пожалуйста, дайте мне знать.

public double evaluateExpressionUsingVariableValues(List<Object> anExpression, Dictionary<String, double> variables)  
{  
    foreach (object element in anExpression)  
    {   
        if(element.GetType()!=typeof(string))  
        {  
            setOperand((double)element);  
        }  
        else if (element.GetType() == typeof(string))  
        {  
            if (!element.ToString().StartsWith("%"))  
            performOperation((string)element);  
        else  
            setOperand(variables[element.ToString()]);  
         }  
     }  

        return this.operand;  
}  

Ответы [ 2 ]

1 голос
/ 19 февраля 2011

Если ваши методы (setOperand, performOperation) вообще изменят коллекцию, вы получите исключение. Вы не можете изменить коллекцию, пока выполняете ее. Один из способов - создать коллекцию результатов и добавлять в нее элементы по мере их изменения, а не пытаться изменить коллекцию на месте.

private void Foo() {
  foreach(var item in items) {
    if (item.IsBad) {
      DeleteItem(item); // will throw an exception as it tries to modify items
    }
  }
}

private void DeleteItem(Item item) {
  items.Remove(item);
}

Вместо этого попробуйте:

private void Foo() {
  List<Item> result = new List<Item>();
  foreach(var item in items) {
    if (!item.IsBad) {
      result.Add(item); // we are adding to a collection other
                        // than the one we are iterating through
    }
  }
  items = result; // we are no longer iterating, so we can modify
                  // this collection
}
0 голосов
/ 19 февраля 2011

Вы уверены, что ни один из методов, которые вы вызываете, не изменяет коллекцию (anExpression)?Такая проблема часто является результатом этого.Попробуйте заменить foreach на цикл for и посмотрите, не возникла ли та же проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...