c#错误:长度不能小于0

时间:2012-05-09 05:51:27

标签: c#

我的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;
}

3 个答案:

答案 0 :(得分:5)

你之前有这样一句话:

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

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

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

希望保留一个Queue<Question>,它最初是完整列表的副本,随机播放。如果要显示新问题,只需从该队列中获取下一个元素即可。这样,当您选择已经显示的问题时,您将不需要循环。 (您可能希望在Index类中包含QuestionNumberQuestion属性,大概是......)

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

答案 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)) 
        : "";
}