代码不会退出foreach块

Mat*_*att 1 c# list

我有以下C#代码段,它接受一个列表,找到准备更新的对象,然后将它们推入临时列表,从主列表中删除,然后继续它的快乐方式.我的问题是循环通过我的主列表的foreach块不会退出.

 TempLog.Clear();   //Ensure TempLog is empty
 foreach (CLogger ready in PlayerLog)
 {
      if (ready.UpdateReady == true)  // Record is ready to be updated in database
      {
           TempLog.Add(ready);  // Add record to templog
           PlayerLog.Remove(ready);  // Remove from playerlog
      }
 }
              <----  Never reaches this point
 if (TempLog.Count > 0)  // Just check that templog isn't empty
 {
      new Thread(Update).Start();  // Run update code 
 }
Run Code Online (Sandbox Code Playgroud)

我已经把大量的调试放入,我可以看到PlayerLog从1开始,TempLog为0,然后进入foreach循环,选择记录UpdateReady标志打开,TempLog转到1,PlayerLog转到0,然后它只是停止..没有错误,只是停止..

谢谢您的帮助 :)

Mar*_*off 14

你在迭代它的枚举器时修改了PlayerLog ,这是一个很大的禁忌.

更好的选择是迭代PlayerLog 的副本,同时修改原始的PlayerLog:

foreach (CLogger ready in new List<PlayerLogType>(PlayerLog))
 {
      if (ready.UpdateReady)  // Please don't compare boolean values against true...
      {
           TempLog.Add(ready);
           PlayerLog.Remove(ready);
      }
 }
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用传统的for循环.就个人而言,我喜欢从最后开始,因为我知道我将删除项目,所以我不必重新调整索引:

for (int i = PlayerLog.Count - 1; i >= 0; i--)
{
      var ready = PlayerLog[i];
      if (ready.UpdateReady)
      {
           TempLog.Add(ready);
           PlayerLog.RemoveAt(i);
      }
}
Run Code Online (Sandbox Code Playgroud)

  • 我同意.修改它循环的东西后,foreach循环应该做什么?从头开始,还是从那里开始?看起来你想说'while(!PlayerLog.empty()){etc etc},你慢慢从PlayerLog中删除元素. (2认同)