我有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;
}
答案 0 :(得分:1)
如果您的方法(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
}
答案 1 :(得分:0)
您确定所调用的方法都没有修改集合(anExpression)吗?这种问题通常是由此产生的。尝试用for循环替换foreach,看看你是否仍然遇到同样的问题。