【问题标题】:Error when calling a method in foreach with object使用对象调用 foreach 中的方法时出错
【发布时间】:2011-06-30 04:22:50
【问题描述】:

我有包含字符串和双精度对象的 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;  
}  

【问题讨论】:

  • 你能告诉你在哪一行出现了哪个错误吗?
  • 抛出的异常是什么?您确定 List 中的所有对象都是字符串还是双精度对象?

标签: c# list object methods foreach


【解决方案1】:

您确定您调用的任何方法都没有修改集合 (anExpression) 吗?这种问题往往是这样的结果。尝试用 for 循环替换 foreach,看看是否仍然遇到同样的问题。

【讨论】:

  • 谢谢,我不知道这个。它实际上是在修改集合。会尽快改变它。这是我第一次在这样的论坛上发帖,必须说它真的很有效。再次感谢
【解决方案2】:

如果你的方法(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
}

【讨论】:

  • 谢谢,我不知道这个。它实际上是在修改集合。会尽快改变它。这是我第一次在这样的论坛上发帖,必须说它真的很有效。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
相关资源
最近更新 更多