我正在尝试弄清楚如何解决标题中所述的错误,该错误发生在此代码段中的粗体行中:
while (textIn.Peek() != -1)
{
string row = textIn.ReadLine();
string[] columns = row.Split('|');
StudentClass studentList = new StudentClass();
studentList.Name = columns[0];
**studentList.Scores = columns[1];**
students.Add(studentList);
}
前一行代码加载名称很好,因为它不是我创建的类中的List,但是“Scores”在列表中。我需要做哪些修改?这些值应该在加载应用程序时显示在文本文件的文本框中。
以下是“分数”所在的课程(我已经突出显示):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyNameSpace
{
//set the class to public
public class StudentClass
{
public StudentClass()
{
this.Scores = new List<int>();
}
public StudentClass (string Name, List<int> Scores)
{
this.Name = Name;
this.Scores = Scores;
}
public string Name
{ get;
set;
}
//initializes the scores
**public List<int> Scores
{ get;
set;
}**
public override string ToString()
{
string names = this.Name;
foreach (int myScore in Scores)
{ names += "|" + myScore.ToString();
}
return names;
}
public int GetScoreTotal()
{
int sum = 0;
foreach (int score in Scores)
{ sum += score;
}
return sum;
}
public int GetScoreCount()
{ return Scores.Count;
}
public void addScore(int Score)
{
Scores.Add(Score);
}
}
}
答案 0 :(得分:0)
您不能只将包含数字序列的字符串分配给List<int>
类型的属性。
您需要将字符串拆分为单独的数字,然后解析这些子字符串以获取它们所代表的整数。
E.g。
var text = "1 2 3 4 5 6";
var numerals = text.Split(' ');
var numbers = numerals.Select(x => int.Parse(x)).ToList();
即。在你的代码中替换:
studentList.Scores = columns[1];
使用:
studentList.Scores = columns[1].Split(' ').Select(int.Parse).ToList();
(或者你自己的多行,更易读/可调试的等价物。)
您需要根据列中的分数格式修改传递给Split()
的参数。
如果您还没有using System.Linq;
,则还需要在顶部添加step="any"
。
答案 1 :(得分:0)
就问题而言,如果列表中有如此多的字符串表示,编译器将如何知道如何将字符串转换为列表。如果是这样做,那将是一个非常缓慢的操作。
<强>修正强>
要修复代码,您可以用此替换循环。
while (textIn.Peek() != -1)
{
string row = textIn.ReadLine();
StudentClass studentList = new StudentClass();
int index = row.IndexOf("|");
//checking that there were some scores
if (index < 0) {
studentList.Name = row;
continue;
}
studentList.Name = row.Substring(0, index);
studentList.Scores = row.Substring(index + 1).Split('|').Select(int.Parse).ToList();
students.Add(studentList);
}
然而,即使使用此修复程序也存在许多问题。 对于一个,如果你要添加另一个由'|'分隔的列表使用这种方法解析会越来越难。
我建议您使用像Json.Net这样更强大和通用的东西来序列化您的类。
希望这有帮助。