C#为什么我不能隐式地将类型'string'转换为'System.Collections.Generic.List <int>'?

时间:2015-12-03 04:05:05

标签: c# arrays list syntax syntax-error

我正在尝试弄清楚如何解决标题中所述的错误,该错误发生在此代码段中的粗体行中:

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


    }



}
}

2 个答案:

答案 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这样更强大和通用的东西来序列化您的类。

希望这有帮助。