我编写了一个函数来遍历列表,并在满足某些条件的情况下删除列表项。我的程序崩溃了,不久后,我得出结论,外部for循环遍历列表中的所有项目。
在相同的例行程序中,项目列表可以缩短。

 // Lijst is a list of a struct that contains a value .scanned and .price

 for (int i = 0; i < Lijst.Count; i++)
  {
   if (Lijst[i].scanned == false)
    {
     // (removed deletion of list item i here)
     if (Lijst[i].price > (int)nudMinimum.Value)
      {
       Totaal++;
        lblDebug.Text = Totaal.ToString();
      }
    Lijst.RemoveAt(i); //<-moved to here
    }
  }


现在,我想知道在不使索引超出范围错误的情况下执行此操作的正确方法是什么。

最佳答案

您可能正在寻找这个

for (int i = Lijst.Count - 1 ; i >= 0 ; i--)
{
    if (Lijst[i].scanned == false)
    {
        if (Lijst[i].price > (int)nudMinimum.Value)
        {
            Totaal++;
            lblDebug.Text = Totaal.ToString();
        }
        Lijst.RemoveAt(i);
    }
}


评论中的问题:


  为什么循环的另一个方向起作用?


因为当循环从零到计数运行时,会出现无法删除索引而仍保留计数的情况。例如:

如果列表中有10个项目,则循环从0开始,将删除0、1、2、3、4,而现在剩下的项目为5,索引也为5,则也将删除该项目。此后,当循环值达到6且剩余项为4时,将产生问题。它会抛出一个错误。即索引超出范围

09-09 21:42