尝试从文本文件读取到List <class>

时间:2019-04-30 01:59:25

标签: c#

我创建了一个非常简单的类,并尝试使用List类从文本文件读取到列表中。
我使用StreamReader inputFile打开文件,但是当我尝试使用ReadLine时,出现一个错误,我无法从字符串转换为... .Bowler(这是我的列表中的名称。

我创建了该类,以便可以从多种形式访问列表。 我显然是C#的新手,并且是一般编程的人。

//the ReadBowlers method reads the names of bowlers 
        //into the listBowlers.
        private void ReadBowlers(List<Bowler> listBowlers)
        {
            try
            {
                //Open the Bowlers.txt file.
                StreamReader inputFile = File.OpenText("Bowlers.txt");

                //read the names into the list
                while (!inputFile.EndOfStream)
                {
                    listBowlers.Add(inputFile.ReadLine());
                }

                //close the file.
                inputFile.Close();
            }
            catch (Exception ex)
            {
                //display error message
                MessageBox.Show(ex.Message);
            }

给我错误的行是: listBowlers.Add(inputFile.ReadLine());

3 个答案:

答案 0 :(得分:1)

您可以创建一个方法,该方法需要从文件中读取string并返回Bowler

例如,假设您的数据行如下所示:

  

Bob Smith,5,XYZ

public Bowler Parse(string inputLine)
{
    // split the line of text into its individual pieces
    var lineSegments = inputLine.Split(',');

    // create a new Bowler using those values
    var result = new Bowler
    {
        Name = lineSegments[0],
        Id = lineSegments[1],
        SomeOtherBowlerProperty = lineSegments[2]
    }
    return result;
}

现在您可以执行以下操作:

var line = inputFile.ReadLine();
var bowler = Parse(line);
listBowlers.Add(bowler);

但是它变得更好了!如果Bowler有很多属性怎么办?如果您不想跟踪每列的位置怎么办?

CsvHelper是一个很棒的Nuget软件包,我敢肯定还有其他类似的软件包。他们让我们使用别人测试过的代码,而不是自己编写。 (我之所以没有这样做,是因为首先编写它是学习的好方法,但是学习使用可用的东西也是很好的。)

如果您的数据具有列标题,则CsvHelper会找出哪些列包含适合您的属性。

因此,假设您将这些数据保存在文件中:

  

FirstName,LastName,Id,StartDate
  鲍勃,史密斯,5,1 / 1/2019
  约翰,加尔特,6,2 / 1/2019

这堂课

public class Bowler
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime? StartDate { get; set; }
}

您可以编写以下代码:

public List<Bowler> GetBowlersFromFile(string filePath)
{
    using(var fileReader = File.OpenText(filePath))
    using (var reader = new CsvReader(fileReader))
    {
        return reader.GetRecords<Bowler>().ToList();
    }
}

它查看标题行并找出哪一列。

答案 1 :(得分:0)

ReadLine()为您提供了字符串,因此除非指定了显式转换,否则您无法将其直接分配给自定义类。

更好地创建一个新的Bowler实例,通过分别解析字符串来分配其值,然后将该实例添加到列表中。

答案 2 :(得分:0)

<div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div><div></div>