C# 错误:长度不能小于 0
本文关键字:不能 小于 错误 | 更新日期: 2023-09-27 18:33:30
我的 C# 程序有问题:我创建了一个包含 10 个问题和 10 张图像的测验。我在生产线上得到这个Length cannot be less than zero.'r'nParameter name: length
int imageIndex = int.Parse(line.Substring(0, delimiter));
即使在我的记事本文件中我也包含了图像索引:
3:What is the foo in the bar?
10:How can you add a widget?
4:Why pick a bar over a foo?
这是代码:
if (nr >= questions.Count)
{
button1.Enabled = false;
}
else
{
Random r = new Random();
int x;
do
{
x = r.Next(questions.Count);
}
while (questions[x].displayed == true);
textBox1.Text = questionText;
radioButton1.Text = questions[x].answer1;
radioButton2.Text = questions[x].answer2;
questions[x].displayed= true;
current_question = x;
}
你之前有过这样的一行:
int delimiter = line.IndexOf(':');
。但是您随后不会检查返回值。如果它是 -1,这意味着在该特定行中找不到您的分隔符 - 但无论如何您都会将其传递给Substring
。在使用delimiter
之前检查它的值 - 这样你就可以抛出一个更有用的异常(或跳过该行,或任何你想做的事情(。
我实际上建议你对代码进行重大更改 - 而不是将questions
保留为List<string>
或其他任何东西,我会创建一个Question
类。 在阅读文本行时解析文本行,丢弃失败 - 或抛出异常 - 在这一点上,而不是等到你碰巧遇到坏问题。然后,您可以有一个List<Question>
,这将使代码的其余部分更简单。
您可能还希望保留一个Queue<Question>
,该最初是完整列表的副本,经过随机播放。当您想要显示新问题时,只需从该队列中获取下一个元素即可。这样,您无需在选择已显示的问题时循环往复。(您可能希望在Question
类中包含Index
或QuestionNumber
属性,大概...
请注意,它可能适用于您真正知道的所有行,但文件末尾有一些空行。您可能只想跳过空行。
子字符串参数是初始索引和长度。 代码中的分隔符看起来不像长度。
http://msdn.microsoft.com/en-us/library/aka44szs.aspx
更改关注
int delimiter = line.IndexOf(':');
int imageIndex = int.Parse(line.Substring(0, delimiter));
string questionText=line.Substring(delimiter + 1);
pictureBox1.Image = imageList1.Images[imageIndex];
textBox1.Text = questionText;
radioButton1.Text = questions[x].answer1;
questions[x].displayed= true;
current_question = x;
自
int delimiter = line.IndexOf(':');
if(!String.IsNullOrEmpty(line) && delimiter > 0 )
{
int imageIndex = int.Parse(line.Substring(0, delimiter));
string questionText=line.Substring(delimiter + 1);
pictureBox1.Image = imageList1.Images[imageIndex];
textBox1.Text = questionText;
radioButton1.Text = questions[x].answer1;
questions[x].displayed= true;
current_question = x;
}
private string copystring(string instr ,int start ,int length)
{
return instr.Length >= (start + 1)
? (instr.Length > (start + length) ? instr.Substring(start, length) : instr.Substring(start,instr.Length-start))
: "";
}