我正在运行此代码,但每次,我都会在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++;
}
答案 0 :(得分:0)
每次通过循环,你都要从列表中删除一个项目。第一次通过后,您的列表中有3个项目[2, 3, 4]
。下一步有两个项目[2, 4]
。然后,您尝试从两个列表中获取第三个项目并获得异常。
要么在循环时单独保留列表,要么确保循环条件实际引用列表的长度。假设您要实际处理所有4个项目,我建议您完全删除RemoveAt
来电。
或者,如果您确实要删除项目,请反转循环的方向:
for (int i = answers.Count - 1; i >= 0; i--)
{
// ....
answers.RemoveAt(i);
}
这仍然会处理列表中的所有项目,并且最后不会在列表中留下任何内容。