【问题标题】:InvalidOperationException was unhandled - why?InvalidOperationException 未处理 - 为什么?
【发布时间】:2012-12-30 01:11:05
【问题描述】:

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

在创建面板时,我将其名称添加到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 上调用“决定”方法,并且每 30 秒使用一个 Timer。当计时器达到指定值时,我重新加载 XML,然后调用该方法。但是,我收到了一个 InvalidOperationException,其中包含“集合已修改;枚举操作可能无法执行”的注释。在foreach (string y in ArrivalsInApp) 行。我完全绝望了,我不知道是什么原因造成的。

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

【问题讨论】:

  • ""收藏已修改;枚举操作可能不会执行。" " - 在迭代之前获取列表的副本,或者向后迭代,检查集合的最后一个成员...
  • @MitchWheat 我不明白,你的意思是像在foreach之前创建一个具有相同内容的新ArrayList,并在foreach中使用这个ArrayList?
  • 数组列表?您使用的是哪个版本的 .NET?
  • .NET 4.0,是的,我听说过 List,但我什至不确定它是什么,不说如何使用它,如果您因此而问的话。

标签: c# arraylist foreach unhandled-exception invalidoperationexception


【解决方案1】:

我收到一个 InvalidOperationException 并评论说“Collection was 修改的;枚举操作可能无法执行。”

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

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

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

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

using System.Linq;

然后在 foreach 语句中你可以这样做:

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

【讨论】:

  • 我刚刚意识到您正在使用 ArrayList - 我不知道 LINQ 会如何应对它,因为它是前泛型并且一切都是对象。您可能必须执行 ArrivalsInApp.Cast().ToArray() 之类的操作才能正确处理它。
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
相关资源
最近更新 更多