有没有办法在不使用List <String>的情况下将txt文件读入列表?

时间:2019-10-22 17:01:09

标签: c# list

我正在尝试将.txt文件读入列表,而不使用List<string>类型。我创建了一个单独的类,称为Club,它完成所有排序。但是,实际上很难读取.txt文件。

string path = "C:\\Users\\Clubs-2019";

public List<Club> ReadClubsTxtFile()
{
    List<Club> outcome = new List<Club>();
    string[] text = File.ReadAllLines(path);
    outcome.Add(text);
    return outcome;
}

outcome.Add(text);行显示错误,因为我试图将错误的类型发送到列表。

这是文本文件的示例:

  

俱乐部名称俱乐部编号会议地址纬度经度会议日会议时间会议结束时间   雪花石膏-佩勒姆4018 1000 1st St North雪花石膏AL 35007 33.252414 -86.813044星期四12:15 PM 1:15 PM   阿尔伯维尔4019 860 Country Club Road阿尔伯维尔AL 35951 34.296807 -86.198587星期二12:00 PM 1:00 PM   亚历山大市29375 16大圣亚历山大市AL 35010 32.945387 -85.953948星期一12:00 PM 1:00 PM

“俱乐部”类如下所示。

public Club(string name, ClubTypes type, long idNumber, RecurrableMeeting regularMeeting = null, RecurrableMeeting boardMeeting = null, List<IndividualMeeting> otherMeetings = null)
    {
        this.name = name;
        this.type = type;
        this.idNumber = idNumber;
        this.regularMeeting = regularMeeting;
        this.boardMeeting = boardMeeting;

        this.otherMeetings = otherMeetings;
        if (this.otherMeetings == null)
            this.otherMeetings = new List<IndividualMeeting>();
    }

2 个答案:

答案 0 :(得分:6)

  

“行”结果.Add(文本); “在我尝试将错误的类型发送到列表时显示错误。”

此错误的原因是您试图将string[]添加到包含Club的列表中。我们需要一个方法,该方法将使用string并返回Club,然后我们可以在添加到列表之前在每个文件行上调用该方法。

执行此操作的一种常见方法是向Parse类添加Club方法,该方法可以从字符串创建该类的实例。

如果您共享了文本文件中的一些示例行(通常这些示例行将映射到该类的属性)以及Club类的定义,则可以提供一个完整的示例。但是,这里有一个示例,可以希望将其应用于您的特定情况。

首先,在文本文件中添加示例行:

1,Ravens,10/10/2019,2
2,Lions,05/25/2019,5.7
3,Tigers,09/12/2018,6.2
4,Bears,11/05/2019,9.1
5,Wildcats,03/04/2017,4.8

Club的定义

public class Club
{
    public int Id {get; set;}
    public string Name {get; set;}
    public DateTime FoundedOn {get; set;}
    public double Score {get; set;}
}

如您所见,文本文件中的行映射到Club类的属性。现在,我们只需要向static类添加一个Club方法,该方法根据文件中的一行文本返回该类的实例。

这个想法是我们将逗号分隔行,将每个部分转换为属性的正确数据类型,设置属性,然后返回类。我们需要验证以下内容:

  • 该行不为空
  • 该行包含正确数量的零件
  • 每个部分都是正确的数据类型

在验证失败的情况下,我们有一些常见的选择:

  • 引发异常
  • 返回null
  • 返回部分填充的类

在下面的示例中,我返回null来指示错误的数据,主要是因为它使解析文件更加容易。

以下是添加了Parse方法的类:

public class Club
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime FoundedOn { get; set; }
    public double Score { get; set; }

    public static Club Parse(string input)
    {            
        // Try to split the string on the comma and
        // validate the result is not null and has 4 parts
        var parts = input?.Split(',');
        if (parts?.Length != 4) return null;

        // Strongly typed variables to hold parsed values
        int id;
        string name = parts[1].Trim();
        DateTime founded;
        double score;

        // Validate the parts of the string
        if (!int.TryParse(parts[0], out id)) return null;
        if (name.Length == 0) return null;
        if (!DateTime.TryParse(parts[2], out founded)) return null;
        if (!double.TryParse(parts[3], out score)) return null;

        // Everything is ok, so return a Club instance with properties set
        return new Club {Id = id, Name = name, FoundedOn = founded, Score = score};
    }
}

现在有了解析方法,我们可以很容易地从文本文件创建一个List<Club>

public static List<Club> ReadClubsTxtFile(string path)
{
    return File.ReadAllLines(path).Select(Club.Parse).ToList();
}

答案 1 :(得分:-2)

您可以执行以下操作:

string path = "C:\\Users\\Clubs-2019";
public List<Club> ReadClubsTxtFile()
{
    return File.ReadAllLines(path)
               .Select( line => new Club {SomeProperty = line} )
               .ToList();
}