InvalidOperationException未处理 - 为什么?

时间:2012-12-30 01:11:06

标签: c# arraylist foreach unhandled-exception invalidoperationexception

首先,在我的代码的开头,我声明了一个ArrayList public ArrayList ArrivalsInApp = new ArrayList();。然后,很久以后,我正在从XML文件下载一些数据。对于每个名为“flight”的XmlNode,我正在创建一个Panel。

在创建Panel时,我将其名称添加到ArrivalsInApp ArrayList中。面板的生成是一种方法。该方法有几个foreach循环和IF条件。从技术上讲,它决定是否应该创建Panel(如果它是XML而不是应用程序),更新(在两者中)或删除(在应用程序中但不在XML中)。

在该方法中,我获取XML中所有航班的名称,保存到ArrayList中。现在使用foreach,我检查应用程序中的所有航班(因此在ArrivalsInApp ArrayList中)是否也在XML中。我使用此代码执行此操作:

foreach (string y in ArrivalsInApp)
{
if (XmlArrivals.Contains(y) == false)
{
*code*
}
}

在form1_load上调用“deciding”方法,使用Timer每30秒调用一次。当计时器达到指定值时,我重新加载XML然后调用该方法。但是,我得到一个InvalidOperationException,注释“Collection已被修改;枚举操作可能无法执行”。在foreach (string y in ArrivalsInApp)行。我完全绝望,我不明白是什么导致了这一点。

如果我运行.exe文件(如果我只是调试它,在计时器达到值之后,程序关闭并显示此错误)会发生什么,即删除Panel,无论是否应该更新或删除,弹出未处理的异常错误。 对不起,如果解释有点困惑。如果有人希望我发布整个源文件(也许是整个项目),请告诉我。但是,由于它现在有大约1800行代码,因此需要进行大量解释。

1 个答案:

答案 0 :(得分:1)

  

我得到一个InvalidOperationException,注释为“Collection is   改性;枚举操作可能无法执行。“

错误消息中的说明正确。集合(在本例中为'ArrivalsInApp')在循环期间被修改。你要么添加一些东西,要么从中删除一些东西。

如果您想循环收集并同时修改它,那么您希望首先获取该集合的副本,并在修改原始文件时循环遍历该副本。

制作副本的最简单方法是使用Linq和ToArray()或ToList()

在文件的顶部,如果它不存在:

using System.Linq;

然后在foreach声明中,您可以执行以下操作:

foreach(string y in ArrivalsInApp.ToArray())
{
  // code to do stuff.
}