【问题标题】:sort text file by property (e.g. .last_name)按属性对文本文件进行排序(例如 .last_name)
【发布时间】:2016-05-08 11:06:22
【问题描述】:

我在 StackOverflow 上搜索过这个问题的答案,但找不到明确的答案。

我有这个播放器课程(是的,我之前发布过课程)

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

然后我还有一个班级锦标赛。我想按其他姓氏对文本文件进行排序。我有一个想法,我可能需要使用IComparable 对文件进行排序。 该文件的结构如下:

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

【问题讨论】:

  • “对文本文件进行排序”是什么意思?您想从文本文件中读取数据并对内存中的项目进行排序?或者您想更改文件的内容?
  • 哎呀...读取数据然后显示按 Last_name 排序的文件
  • 假设你有工作代码来读取文件,那么它就是stackoverflow.com/questions/3309188/…的副本
  • 没有“排序文件”的可能性。您必须读取数据,以@Evan 的身份在内存中排序并最终保存到文件排序数据。要在内存中排序,您可以在文件读取期间使用 Linq 或 SortedList。
  • 我自己做了一些工作,并尝试这样做:List&lt;string&gt; lines = File.ReadLines(@"C:\Users\Johannes\Downloads\BAIT\GOOP\Eksamen\MalePlayer.txt").ToList(); public List&lt;Player&gt; GetPlayerList&lt;T&gt;(IEnumerable&lt;Player&gt; lines, Func&lt;Player, T&gt; Last_name) { return (from Player in lines orderby Last_name(Player) select Player).ToList(); } svm var playersOrderedByLastName = GetPlayerList(lines, x =&gt; x.Last_name); 但我得到一个错误,所以我认为这是不对的

标签: c# arrays sorting icomparable


【解决方案1】:

首先你没有任何东西可以排序。所以添加到类

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

接下来您需要在以下函数中将项目添加到列表中

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

现在你有一些东西要分类了。所以添加一个排序方法(或 CompareTo())

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

【讨论】:

  • 那么在 Main 中做什么,将其写入控制台?例如显示它按姓/名排序
  • 首先做你需要做的事情。你没有在你的问题中说你需要它。
  • 要么使用类中的排序方法,要么对公共属性'players'进行排序。您没有发布主要方法,所以我不知道您在做什么。最好在类中有一个静态项目播放器,然后在 main 方法中使用它。如果您已经在 main 中有一个玩家列表,请对存在的列表进行排序。
  • 到目前为止,我在 Main 中什么都没有:static void Main(string[] args) { /*AddMalePlayer(3); AddFemalePlayer(7); AddReferee(9);*/ players.Sort(); } 当我写那个时,我没有向控制台写任何东西
  • 您需要一个 write() 方法,该方法接受“玩家”并写入控制台。现在只有 load 方法写入控制台。
猜你喜欢
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2011-10-15
相关资源
最近更新 更多