C#为什么可以';t我隐式转换类型';字符串';到';System.Collections.Ge
本文关键字:字符串 类型 Ge 转换 Collections System 为什么 | 更新日期: 2023-09-27 18:25:35
我正试图找出如何解决标题中所述的错误,该错误出现在以下代码段中的粗体行:
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);
}
}
}
不能只将包含数字序列的字符串分配给类型为List<int>
的属性。
您需要将字符串拆分为单独的数字,然后解析这些子字符串以获得它们所代表的整数。
例如
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;
,您还需要在顶部添加它。
就问题而言,当一个列表有这么多字符串表示时,编译器如何知道如何将字符串转换为列表。如果要这样做,那将是一个极其缓慢的操作。
修复
要修复您的代码,您可以用这个替换您的循环。
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.
希望这能有所帮助。