-3

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

3 に答える 3

5

以前は次のような行がありました。

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

...しかし、戻り値をチェックしていません。-1 の場合、区切り文字がその特定の行で見つからなかったことを意味しますが、Substringとにかくそれを渡しています。使用する前にの値を確認してください。delimiterそうすれば、より有用な例外をスローできます (または、行をスキップしたり、やりたいことを何でもしたりできます)。

実際には、コードを大幅に変更することをお勧めします。そのままにquestionsしておくのではなくList<string>、クラスを作成しますQuestion。テキストの行を読みながら解析し、その時点でエラーを破棄 (または例外をスロー) します。たまたま悪い質問にたどり着くまで待つのではありません。次にList<Question>、コードの残りの部分をより単純にする を使用できます。

最初は完全なリストのコピーである をシャッフルして保持することもできます。Queue<Question>新しい質問を表示したいときは、そのキューから次の要素を取り出してください。そうすれば、すでに表示されている質問を選ぶときにループする必要がなくなります。(おそらく、クラス内に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 に答える