我的项目是关于班级帐户和2个子班级(经常帐户和存款帐户)。
在主要我创建了一个帐户的arraylist 但我试图删除此方法中的对象:
public static void Remove(ArrayList L, int accnb)
{
foreach(Account obj in L)
{
if(obj.AccN == accnb)
L.Remove(obj);
}
}
但是我收到了一个错误:收集已修改;枚举操作可能无法执行。
所有其他方法,如添加或返回字符串工作正常..
答案 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>();
此列表还可以包含派生类CurrentAccount
和DepositAccount
的对象。像这样使用它
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);
}
}
foreach
语句用于遍历集合以获取所需的信息,但不能用于在源集合中添加或删除项目以避免不可预测的副作用。如果需要在源集合中添加或删除项目,请使用for循环。
答案 2 :(得分:0)
foreach实际上不适用于集合,但使用Enumerators。虽然所有集合都可以隐式转换为枚举器,但Enumeartor规则仍然适用。
所以基本上你的代码被解释为:
temp IEnumerator = L.GetEnumerator();
foreach(Account obj in temp)
&#13;
所有枚举者都有无法更改基础集合的规则。这样做(必须)使枚举器无效。除了下一次调用.Current()之外,Wich会抛出。
由于您在使用枚举器时无法更改集合,并且foreach仅使用引擎盖下的枚举器,这意味着您在使用foreach时无法更改colelciton(包含删除元素)。你需要一个更多罗嗦的循环才能做到这一点。