For循环中的C#超出范围

时间:2016-03-12 13:20:28

标签: c#

我正在运行此代码,但每次,我都会在for循环的第一行收到错误“类型'未处理的异常'System.ArgumentOutOfRangeException'。它基本上是一个多项选择测验问题的代码,有问题&存储在二维数组中的答案。

不幸的是,我似乎无法发现问题。这可能是一个简单的错误,但我是初学者,所以我很难发现它。

我已经阅读了类似的问题,但我不明白为什么这条线会导致问题。我的列表中有4个元素,一个在循环之前删除,所以应该剩下3个。我只循环了3次,所以我不明白问题是什么。

希望有人能够提供帮助,谢谢!

     Random rndq = new Random();
     Random rnda = new Random();
     List<int> answers = new List<int> { 1, 2, 3, 4 };

     int questionchoice = rndq.Next(0, questions.GetLength(0) - 1);
     int labelchoice = rnda.Next(0, answers.Count-1);
     lblQuestion.Text = questions[questionchoice, 0];
     var answer = (Label)Controls["lblAns" + answers[labelchoice]];
     answer.Text = questions[questionchoice, 1];

     answers.Remove(labelchoice);

     int j = 2;
     for (int i = 0; i < 3; i++)
     {
         var wronganswers = (Label)Controls["lblAns" + answers[i]];
         wronganswers.Text = questions[questionchoice, j];
         answers.RemoveAt(i);
         j++;
     }

1 个答案:

答案 0 :(得分:0)

每次通过循环,你都要从列表中删除一个项目。第一次通过后,您的列表中有3个项目[2, 3, 4]。下一步有两个项目[2, 4]。然后,您尝试从两个列表中获取第三个项目并获得异常。

要么在循环时单独保留列表,要么确保循环条件实际引用列表的长度。假设您要实际处理所有4个项目,我建议您完全删除RemoveAt来电。

或者,如果您确实要删除项目,请反转循环的方向:

for (int i = answers.Count - 1; i >= 0; i--)
{
    // ....
    answers.RemoveAt(i);
}

这仍然会处理列表中的所有项目,并且最后不会在列表中留下任何内容。

相关问题