-1

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

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

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

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

“决定”方法在 form1_load 上调用,每 30 秒使用一个 Timer。当计时器达到指定值时,我重新加载 XML,然后调用该方法。但是,我收到了一个 InvalidOperationException,并附有“集合已修改;枚举操作可能无法执行”的注释。在线foreach (string y in ArrivalsInApp)。我完全绝望,我不知道是什么原因造成的。

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

4

1 回答 1

1

我收到一个 InvalidOperationException 注释“集合已修改;枚举操作可能无法执行”。

错误消息中的解释是正确的。集合(在本例中为“ArrivalsInApp”)在循环期间被修改。您要么向其中添加了某些内容,要么从中删除了某些内容。

如果您想遍历一个集合并同时对其进行修改,那么您需要先获取该集合的副本,然后在修改原始集合时遍历该副本。

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

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

using System.Linq;

然后在 foreach 语句中,您可以执行以下操作:

foreach(string y in ArrivalsInApp.ToArray())
{
  // code to do stuff.
}
于 2012-12-30T01:32:06.003 回答