我有:
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&lt;字符串&gt;到列表&lt; int&gt;。没有编译器错误,但是“FormatException未被解析”的运行时错误,并指向(int.Parse)。我已经读过,如果在空字符串上使用int.Parse会导致这种情况,但我不知道如果是这样的情况。
答案 0 :(得分:3)
因为你要附加一个空格,“Split”方法会在你不想要的结尾处返回一个空元素,添加na选项“SplitOptions.RemoveEmptyEntries”(从头开始,检查它是否是正确的名称)和你的代码可以工作。
答案 1 :(得分:0)
你可以像这样使用TryParse
,
student = new Student(txtName.Text, result.Select(s =>
{
int res = 0;
return int.TryParse(s, out res) ? res : 0;
}).ToList());
此代码将避免您获得的异常,如果它无法解析任何值,则会将其设置为0
答案 2 :(得分:0)
问题是,在按空格('')拆分后,其中一个字符串无效。 我建议只考虑那些有效数字的分数。
让我们考虑下面用空格分隔的分数
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();
答案 3 :(得分:-3)
通过在以下行中的Visual Studio中设置断点,可以轻松调试此错误:
student = new Student(txtName.Text, result.Select(int.Parse).ToList())
...然后手动检查result
列表。其中一个字符串肯定不是可解析的int。
简而言之:您有一个很好的错误消息,并且应该能够使用标准调试技术快速找到此错误。