-3

I have a problem with my C# program: I have created a quiz with 10 questions and 10 images. I get this Length cannot be less than zero.\r\nParameter name: length at the line

int imageIndex = int.Parse(line.Substring(0, delimiter));

Even if in my notepad file I included the image index:

3:What is the foo in the bar? 
10:How can you add a widget? 
4:Why pick a bar over a foo?

Here is the code:

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;
}
4

3 回答 3

5

你以前有这样的一行:

int delimiter = line.IndexOf(':');

...但是您没有检查返回值。Substring如果它是 -1,这意味着在该特定行中没有找到您的分隔符 - 但无论如何您都会将它传递给它。在使用它之前检查它的值delimiter——这样你就可以抛出一个更有用的异常(或者跳过这一行,或者你想做的任何事情)。

实际上,我建议您对代码进行重大更改-而不是保留questions为 aList<string>或其他任何内容,而是创建一个Question类。在阅读时解析文本行,在这一点上丢弃失败或抛出异常,而不是等到碰巧遇到错误的问题。然后,您可以拥有一个List<Question>这将使其余代码更简单。

您可能希望保留Queue<Question>最初是完整列表副本的 a ,已打乱。当您想显示一个新问题时,只需从该队列中取出下一个元素。这样你就不需要在选择已经显示的问题时循环。(你可能想在类中包含一个IndexorQuestionNumber属性Question,大概......)

请注意,它可能适用于您真正知道的所有行,但文件末尾有一些空行。您可能只想跳过空行。

于 2012-05-09T05:58:38.807 回答
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; 
    }
于 2012-05-09T05:54:58.603 回答
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)) 
        : "";
}
于 2015-11-06T06:38:00.720 回答