使用object调用foreach中的方法时出错

时间:2011-02-18 23:40:19

标签: c# list object methods foreach

我有List的字符串和双精度对象,我尝试根据itemtype及其值调用不同的方法。在调试器中,我可以看到第一次迭代工作正常,但在调用方法后第二次进入时会显示错误。
如果我注释掉这些方法并放入简单的方法就可以了,所以我理解它是如何调用方法的。

我做错了什么,我该怎么做才能使它发挥作用? 如果有更简单的方法来做我正在尝试的事情,请告诉我。

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 个答案:

答案 0 :(得分:1)

如果您的方法(setOperandperformOperation)完全修改了集合,您将获得异常。在迭代它时,您无法修改集合。一种方法是创建结果集合并在更改时向其中添加项目,而不是尝试就地修改集合。

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
}

答案 1 :(得分:0)

您确定所调用的方法都没有修改集合(anExpression)吗?这种问题通常是由此产生的。尝试用for循环替换foreach,看看你是否仍然遇到同样的问题。