我的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;
}
答案 0 :(得分:5)
你之前有这样一句话:
int delimiter = line.IndexOf(':');
...但是你没有检查返回值。如果它为-1,则表示在该特定行中找不到分隔符 - 但无论如何您都将其传递给Substring
。在使用它之前检查delimiter
的值 - 这样你就可以抛出一个更有用的异常(或者跳过这行,或者你想做的任何事情)。
我实际上建议您更改代码 - 而不是将questions
保留为List<string>
或其他任何内容,我会创建一个Question
类。在阅读时解析文本行,在此时丢弃失败 - 或抛出异常 - 而不是等到碰巧碰到坏问题。然后,您可以使用List<Question>
,这将使其余代码更简单。
您还希望保留一个Queue<Question>
,它最初是完整列表的副本,随机播放。如果要显示新问题,只需从该队列中获取下一个元素即可。这样,当您选择已经显示的问题时,您将不需要循环。 (您可能希望在Index
类中包含QuestionNumber
或Question
属性,大概是......)
请注意,它可能适用于您真正了解的所有行,但您的文件末尾有一些空行。你可能只想跳过空行。
答案 1 :(得分:1)
子串参数是初始索引和长度。代码中的分隔符看起来不像长度。
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;
}
答案 2 :(得分:0)
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))
: "";
}