我的c#项目中的System.InvalidOperationException

时间:2017-12-30 17:29:52

标签: c# oop

我的项目是关于班级帐户和2个子班级(经常帐户和存款帐户)。

在主要我创建了一个帐户的arraylist 但我试图删除此方法中的对象:

    public static void Remove(ArrayList L, int accnb)
    {
        foreach(Account obj in L)
        {
            if(obj.AccN == accnb)
                L.Remove(obj);
        }
    }

但是我收到了一个错误:收集已修改;枚举操作可能无法执行。

所有其他方法,如添加或返回字符串工作正常..

3 个答案:

答案 0 :(得分:0)

使用foreach迭代集合时,请勿删除元素。

另外,我建议使用List<T>而不是ArrayList

解决手头任务的更简单方法就是:

public static void Remove(List<Account> L, int accnb) => 
                            L.RemoveAll(obj => obj.AccN == accnb);

答案 1 :(得分:0)

ArrayList中的项目输入为object。因此,C#不知道他们有一个名为AccN的成员。

有一个名为ArrayList的强类型,通用等效List<T>。在此处使用

创建列表时,可以明确指定列表项的类型
List<Account> accounts = new List<Account>();

此列表还可以包含派生类CurrentAccountDepositAccount的对象。像这样使用它

public static void Remove(List<Account> L, int accnb)
{
    foreach(Account acc in L)
    {
        if(acc.AccN == accnb)
            L.Remove(acc);
    }
}

注意:在C#1.0和C#1.1中没有泛型。因此,实现了弱类型集合ArrayList。由于泛型是在C#2.0中引入的,因此这种类型大多已经过时了。

使用ArrayList,您必须将对象强制转换为正确的类型才能使其正常工作

if(((Account)acc).AccN == accnb)

您还有另一个问题。您无法使用foreach更改您枚举的集合,因为这会使foreach混淆。改为使用for循环,并确保以相反的顺序循环,以便在删除项目时不更改前面项目的索引。

for (int i = L.Count - 1; i >= 0; i--) {
    if (L[i].AccN == accnb) {
        L.RemoveAt(i);
    }
}

C# Reference说:

  

foreach语句用于遍历集合以获取所需的信息,但不能用于在源集合中添加或删除项目以避免不可预测的副作用。如果需要在源集合中添加或删除项目,请使用for循环。

答案 2 :(得分:0)

foreach实际上不适用于集合,但使用Enumerators。虽然所有集合都可以隐式转换为枚举器,但Enumeartor规则仍然适用。

所以基本上你的代码被解释为:

&#13;
&#13;
temp IEnumerator = L.GetEnumerator();
foreach(Account obj in temp)
&#13;
&#13;
&#13;

所有枚举者都有无法更改基础集合的规则。这样做(必须)使枚举器无效。除了下一次调用.Current()之外,Wich会抛出。

由于您在使用枚举器时无法更改集合,并且foreach仅使用引擎盖下的枚举器,这意味着您在使用foreach时无法更改colelciton(包含删除元素)。你需要一个更多罗嗦的循环才能做到这一点。