Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# InvalidOperationException未处理-为什么?_C#_Arraylist_Foreach_Unhandled Exception_Invalidoperationexception - Fatal编程技术网

C# InvalidOperationException未处理-为什么?

C# InvalidOperationException未处理-为什么?,c#,arraylist,foreach,unhandled-exception,invalidoperationexception,C#,Arraylist,Foreach,Unhandled Exception,Invalidoperationexception,首先,在代码的开头,我声明了一个ArrayListpublic ArrayList ArrivalsInApp=new ArrayList()。然后,很久以后,我从XML文件下载了一些数据。我正在为每个名为“flight”的XmlNode创建一个面板 创建面板时,我将其名称添加到ArrivalSnapArrayList中。面板的生成是在一个方法中进行的。该方法有几个foreach循环和IF条件。从技术上讲,它所做的一切都决定了面板是应该创建(如果是在XML中而不是在应用程序中)、更新(在两者中)

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

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

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

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

在form1_load上调用“Decision”方法,并使用计时器每隔30秒调用一次。当计时器达到指定值时,我重新加载XML,然后调用该方法。但是,我得到了一个InvalidOperationException,注释是“集合已修改;枚举操作可能无法执行。”在第
foreach行(ArrivalSnapp中的字符串y)
。我完全绝望了,我不知道这是什么原因

如果我运行.exe文件(如果我只是调试它,在计时器达到该值后,程序关闭并显示此错误),则会发生以下情况:面板将被删除,而不管它是应该更新还是删除,并且会弹出未处理的异常错误。 抱歉,如果解释有点混乱。如果有人想让我发布整个源文件(可能是整个项目),请告诉我。然而,由于它现在有大约1800行代码,它需要相当多的解释

我得到一个InvalidOperationException,评论说“收集是 已修改;枚举操作可能无法执行。“

错误消息中的解释是正确的。在循环过程中修改了集合(在本例中为“ArrivalSnapp”)。要么你添加了什么,要么从中删除了什么

如果要在集合上循环并同时对其进行修改,则首先要获取集合的副本,并在修改原始集合时循环该副本

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

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

using System.Linq;
然后在foreach Station中,您可以执行以下操作:

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

“”收藏被修改;枚举操作可能无法执行。“-在迭代之前复制列表,或者向后迭代,检查集合的最后一个成员…@MitchWheat我不明白,您的意思是像foreach之前一样创建一个具有相同内容的新ArrayList,并在foreach中使用此ArrayList?ArrayList?你使用的是什么版本的.NET?.NET 4.0,是的,我听说过List,但我甚至不确定它是什么,更不用说如何使用它了,如果你问这个问题的话。我刚刚意识到你在使用ArrayList-我不知道LINQ会如何反应,因为它是预泛型,一切都是对象。您可能必须执行ArrivalSnapp.Cast().ToArray()之类的操作才能正确处理它。