0

私は持っている:

    private void btnAddScore_Click(object sender, EventArgs e)
    {
        if (IsInt32())     
        {
            txtScores.Text += txtScore.Text + " ";
            txtScore.Text = "";
        }
    }

と:

    private void button2_Click(object sender, EventArgs e)
    {
        if (IsValidData())
        {
            List<string> result = txtScores.Text.Split(' ').ToList();
            student = new Student(txtName.Text, result.Select(int.Parse).ToList());
            this.Close();
        }

    }

btnAddScore を使用して、txtScore から txtScores までのスコアの文字列を作成しようとしています。これは私が正しくやっていると信じています。次に、各要素を " " で解析して、その文字列をリストに変換しています。次に、List < string > を List < int > にさらに変換します。コンパイラ エラーはありませんが、「FormatException was unhandled」というランタイム エラーが発生し、(int.Parse) を指しています。int.Parse が空の文字列で使用されるとこれが発生することを読みましたが、そうである場合はどうなるかわかりません。

4

4 に答える 4

3

空白を追加しているため、「Split」メソッドは予期しない最後に空の要素を返します。na オプション「SplitOptions.RemoveEmptyEntries」を追加します (ヘッドから、正しい名前かどうかを確認してください)。コードは機能します。 .

于 2014-03-07T06:40:09.313 に答える
0

あなたはTryParseこのように使うことができます、

student = new Student(txtName.Text, result.Select(s =>
    {
        int res = 0;
        return int.TryParse(s, out res) ? res : 0;
    }).ToList());

このコードは、取得している例外を回避し、値を解析できない場合は 0 に設定します

于 2014-03-07T06:43:38.947 に答える
0

問題は、スペース (' ') で分割した後、文字列の 1 つが有効な int ではないことです。有効な数値であるスコアのみを考慮することをお勧めします。

以下のスコアをスペースで区切って考えてみましょう

111 123 12x 212 1454

ここで12xは有効ではないため、この番号を拒否する必要があります。以下のコードサンプルに示すように、有効な数字を 4 つだけ取得します。

var scores = "111 123 12x 212 1454";
var regex = new Regex("^[0-9]*$");
var studentScore = scores.Split(' ').Where(a => regex.IsMatch(a)).ToList();
于 2014-03-07T06:46:02.290 に答える
-3

このエラーは、Visual Studio で次の行にブレーク ポイントを設定することで簡単にデバッグできます。

student = new Student(txtName.Text, result.Select(int.Parse).ToList())

...そしてresultリストを手動で検査します。文字列の 1 つは、解析可能な int ではありません。

要するに、適切なエラー メッセージが表示され、標準のデバッグ手法を使用してこのエラーをすばやく見つけることができるはずです。

于 2014-03-07T06:37:32.727 に答える