使用对象调用 foreach 中的方法时出错

发布于 2024-10-18 06:42:22 字数 829 浏览 2 评论 0原文

我有包含字符串和双精度对象的列表,我尝试根据项目类型及其值调用不同的方法。在调试器中,我可以看到第一次迭代工作正常,但在调用方法后第二次输入时显示错误。
如果我注释掉这些方法并放入简单的方法,它就会起作用,所以我知道这与我调用这些方法的方式有关。

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

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

I have List with objects of strings and doubles, and I try to call different methods based on the itemtype and their value. In the debugger I can see that the first iteration works fine, but an error shows when entering the second time after a method is called.
If i comment out the methods and put in simple methods it works, so I understand that it something with how I call the methods.

What do I do wrong, and what can I do to make it work?
If there is easier ways to do what I'm trying, please let me know.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

皓月长歌 2024-10-25 06:42:23

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

If your methods (setOperand, performOperation) modify the collection at all, you will get an exception. You can't modify the collection while you are iterating over it. One method is to create a result collection and add items to it as you change them, rather than trying to modify the collection in-place.

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

Instead, try:

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
}
ぃ弥猫深巷。 2024-10-25 06:42:23

您确定您调用的方法都没有修改集合(anExpression)吗?此类问题往往就是由此造成的。尝试用 for 循环替换 foreach ,看看是否仍然遇到相同的问题。

Are you sure that none of the methods you are calling is modifying the collection (anExpression) ? This kind of problem is often the result of that. Try replacing the foreach by a for loop and see if you still get the same issue.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文