Search code examples
c#arrayssortingicomparable

sort text file by property (e.g. .last_name)


I've searched StackOverflow for an answer to this, but can't find a clear answer.

I've this Player Class (Yes i've posted the class before)

namespace Tennis_Match
{
class Player
{
    private string first_name;
    private string middle_name;
    private string last_name;
    private DateTime dob;
    private string nat;
    private char gender;
    public string First_name { get { return first_name; } set { first_name = value; } }
    public string Middle_name { get {return middle_name; } set { middle_name = value; } }
    public string Last_name { get { return last_name; } set { last_name = value; } }
    public DateTime Dob { get { return dob; } set { dob = value; } }
    public string Nat { get { return nat; } set { nat = value; } }
    public char Gender { get { return gender; } set { gender = value; } }
    public Player(string first_name, string last_name, string middle_name, DateTime dob, string nat, char gender)
    {
        this.first_name = first_name;
        this.last_name = last_name;
        this.middle_name = middle_name;
        this.dob = dob;
        this.nat = nat;
        this.gender = gender;
    }
    public override string ToString()
    {
        return first_name + " " + middle_name + " " + last_name + " " + dob + " "+ nat + " " + gender;
    }

    public static int CalculateAge(DateTime dob)
    {
        int years = DateTime.Now.Year - dob.Year;

        if ((dob.Month > DateTime.Now.Month) || (dob.Month == DateTime.Now.Month && dob.Day > DateTime.Now.Day))
            years--;

        return years;
    }

    private List<string> content = new List<string>();
    public string FileName { get; set; }
    public string Delimiter { get; set; }
    private void Load()
    {
        TextFieldParser par = new TextFieldParser(FileName);
        par.TextFieldType = FieldType.Delimited;
        par.SetDelimiters(Delimiter);
        while (!par.EndOfData)
        {
            string[] fields = par.ReadFields();
            foreach (string field in fields)
            {
                Console.WriteLine(field);
            }
        }
        par.Close();
    }
    public void RunReadCSVFile(string fn, string delim = "|")
    {
        FileName = fn;
        Delimiter = delim;
        Load();
    }
    public string GetLine(string fileName, int line)
    {
        using (var sr = new StreamReader(fileName))
        {
            for (int i = 1; i < line; i++)
                sr.ReadLine();
            return sr.ReadLine();
        }
    }
}
}

Then I've another class tournament. I want to sort a textfile by among other Last_name. I've got an idea that i might need to use IComparable to sort the file. The file is structured like this:

1|Mariuss|Luka|Thygesen|1986-07-25|NAURU|NR

Solution

  • First you have nothing to sort. So add to class

     static List<Player> players = new List<Player>();
    

    Next you need to add items to List in following function

           private void Load()
            {
                TextFieldParser par = new TextFieldParser(FileName);
                par.TextFieldType = FieldType.Delimited;
                par.SetDelimiters(Delimiter);
                while (!par.EndOfData)
                {
                    string[] fields = par.ReadFields();
                    foreach (string field in fields)
                    {
                        Console.WriteLine(field);
                    }
                    //-----------------------------Add -----------------------
                    Player newPlayer = new Player(fields[0], fields[1], fields[2], DateTime.Parse(fields[3]), fields[4], fields[5][0]);
                    players.Add(newPlayer);
                }
                par.Close();
            }
    

    Now you have something to sort. So add a sort method (or CompareTo())

    public void Sort()
            {
                players = players.OrderBy(x => new { x.last_name, x.first_name, x.middle_name }).ToList();
            }