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);

    }

}
}

C#为什么可以';t我隐式转换类型';字符串';到';System.Collections.Ge

不能只将包含数字序列的字符串分配给类型为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.

希望这能有所帮助。