加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C# – foreach显示奇怪的行为/没有问题

发布时间:2020-12-15 08:12:41 所属栏目:百科 来源:网络整理
导读:今天我编写了一个使用两个嵌套的foreach循环的函数.看到后,它没有像预期的那样工作,我调试了它.但我没有看到错误,并且不认为一个简单的错误可能导致我注意到的行为. 该部分看起来像这样: foreach(MyClass cItem in checkedListBoxItemList.Items){ foreach(
今天我编写了一个使用两个嵌套的foreach循环的函数.看到后,它没有像预期的那样工作,我调试了它.但我没有看到错误,并且不认为一个简单的错误可能导致我注意到的行为.

该部分看起来像这样:

foreach(MyClass cItem in checkedListBoxItemList.Items)
{
   foreach(MyClass cActiveItem in ActiveItemList)
   {
      if (cActiveItem.ID == cItem.ID) /*...check checkbox for item...*/;
   }
}

可以说,checkedListBoxItemList.items包含4个MyClass类型的项目,而ActiveItemList是List< MyClass>有2个项目.

调试器跳转到外部foreach,到达内部foreach,执行if 2次(每个cActiveItem一次)并到达外部foreach的末尾.现在,调试器跳回到foreach外部的头部.但是调试器不是启动外部foreach的第二轮,而是突然跳转到MyClass.ToString()方法.
我可以通过这个方法4次(checkedListBoxItemList.Items中的项目数)
然后……没什么. Visual Studio向我展示了我的窗体,并且不再继续使用foreach.

将代码更改为时

int ListCount = checkedListBoxItemList.Items.Count;
for(int i=0; i<ListCount; i++)
{
   MyClass cItem = checkedListBoxItemList.Items[i] as MyClass;
   foreach(MyClass cActiveItem in ActiveItemList)
   {
      if (cActiveItem.ID == cItem.ID) /*...check checkbox for item...*/;
   }
}

一切正常,按照假设.
我向同事展示了这个问题,但他也不明白,发生了什么.我不明白为什么调试器会跳转到MyClass.ToString()方法.我用F10来逐步完成,所以不需要离开这个功能.甚至,如果有原因,为什么foreach循环不会继续?

我使用Visual Studio 2010,如果这是任何问题.

请告诉我发生了什么.谢谢.

解决方法

迭代集合(使用foreach)时,不允许更改正在迭代的集合;但是当您选中匹配项的复选框时,外部循环(checkedListBoxItemList.Items)的集合会发生变化,并且可能会吞下引发的后续错误.这或多或少解释了为什么你突然进入ToString方法并且不继续循环.

当您使用forstatement进行迭代时,您没有这个限制,因为在您开始迭代时没有对集合的引用.

希望这能解释.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读