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 unandled”并指向(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

问题是您的字符串之一在按空格('')拆分后无效 int 。我建议只考虑那些有效数字的分数。

让我们考虑下面用空格分隔的分数

111 123 12x 212 1454

这里12x无效,所以你应该拒绝这个数字。并仅获得四个有效数字,如下面的代码示例所示:

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手动检查列表。其中一个字符串绝对不是可解析的 int。

简而言之:您有一个很好的错误消息,并且应该能够通过使用标准调试技术快速找到此错误。

于 2014-03-07T06:37:32.727 回答