Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#按分数排序行_C#_Winforms - Fatal编程技术网

C#按分数排序行

C#按分数排序行,c#,winforms,C#,Winforms,我有一个名为Player的类,它有属性name和score,在每一场比赛之后,它们都用方法file.AppendAllText(path,content+Environment.NewLine)写入文件中。 现在,当点击标签“分数”并加载新表单时,我必须将它们添加到列表框中。但我想使用我的类播放器,将项目添加到列表中或作为播放器添加,而不仅仅是从文件中加载它们…我使用了SortedList,如下所示 SortedList<int, Player> topList = new

我有一个名为Player的类,它有属性name和score,在每一场比赛之后,它们都用方法
file.AppendAllText(path,content+Environment.NewLine)写入文件中。
现在,当点击标签“分数”并加载新表单时,我必须将它们添加到列表框中。但我想使用我的类播放器,将项目添加到列表中或作为播放器添加,而不仅仅是从文件中加载它们…我使用了
SortedList
,如下所示

    SortedList<int, Player> topList = new SortedList<int, Player>();

    private void Scores_Load(object sender, EventArgs e)
    {
        topList.Clear();
        string filename = "highscores.txt";
        using (StreamReader sr = File.OpenText(filename))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                string[] s = line.Split(';');
                string name = s[0];
                int score = int.Parse(s[1]);
                Player newPlayer = new Player(name, score);
                if (!topList.ContainsKey(score))
                    topList.Add(score, newPlayer);
            }
        }

        Output();
    }
    private void Output()
    {
        lstScores.Items.Clear();
        int rank = 1;
        foreach (int k in topList.Keys.Reverse())
        {
            if (rank < 10)//top 9
            {
                Player temp = (Player)topList[k];
                lstScores.Items.Add("  " + rank.ToString() + "\t" + temp.ToString());//override of method ToString(), so it returns in format Name+"\t"+Score;
            }
            rank++;
        }
    }
SortedList topList=新的SortedList();
私有无效分数加载(对象发送方,事件参数e)
{
topList.Clear();
字符串filename=“highscores.txt”;
使用(StreamReader sr=File.OpenText(文件名))
{
弦线;
而((line=sr.ReadLine())!=null)
{
字符串[]s=line.Split(“;”);
字符串名称=s[0];
int score=int.Parse(s[1]);
玩家newPlayer=新玩家(姓名、分数);
如果(!topList.ContainsKey(分数))
添加(分数,新玩家);
}
}
输出();
}
私有void输出()
{
lstScores.Items.Clear();
int秩=1;
foreach(topList.Keys.Reverse()中的int k)
{
如果(排名<10)//排名前9
{
玩家临时=(玩家)排行榜[k];
lstScores.Items.Add(“+rank.ToString()+”\t“+temp.ToString());//重写方法ToString(),因此它以格式Name+“\t”+Score返回;
}
排名++;
}
}
现在这是可以接受的,但这里的问题是,我不能有两个相同的键,在这种情况下,键是score…所以我想知道如何修改它,以便我可以有两个或更多相同的分数?…也许我应该使用
List
,但我不知道如何按分数对列表排序,因为我在同一行文件(name+score)中有string+int?

使用列表而不是SortedList,并使用OrderBy Linq方法(System.Linq):

公共类播放器
{
公共字符串名称{get;set;}
公共整数分数{get;set;}
}
var topList=新列表();
topList=topList.OrderBy(x=>x.Score);
使用列表而不是SortedList,并使用OrderBy Linq方法(System.Linq):

公共类播放器
{
公共字符串名称{get;set;}
公共整数分数{get;set;}
}
var topList=新列表();
topList=topList.OrderBy(x=>x.Score);
您可以使用列表:

List<Player> players = new List<Player>();
players.Add(new Player(name, score));
您可以使用列表:

List<Player> players = new List<Player>();
players.Add(new Player(name, score));

阅读您的文件并交出玩家,然后使用链接OrderBy操作符:

private IEnumerable<Player> ReadPlayers(TextReader rd){
  string line;
        while ((line = sr.ReadLine()) != null)
        {
            string[] s = line.Split(';');
            string name = s[0];
            int score = int.Parse(s[1]);
            yield return new Player(name, score);
        }
}

private void Scores_Load(object sender, EventArgs e)
{
    string filename = "highscores.txt";
    using (StreamReader sr = File.OpenText(filename)){ 
      var sortedPlayers= ReadPlayers(rd)
                             .OrderByDescending(x=x.Score)
                             .Take(10)
                             .Select((p,r)=>$"rank {r+1}:{p.Name} : {p.Score}");
       lstScore.Items.Clear();
       foreach(var p in sortedPlayers) lstScore.Items.Add(p); 
    }
private IEnumerable ReadPlayer(TextReader rd){
弦线;
而((line=sr.ReadLine())!=null)
{
字符串[]s=line.Split(“;”);
字符串名称=s[0];
int score=int.Parse(s[1]);
返回新玩家(姓名、分数);
}
}
私有无效分数加载(对象发送方,事件参数e)
{
字符串filename=“highscores.txt”;
使用(StreamReader sr=File.OpenText(filename)){
var sortedPlayers=ReadPlayers(rd)
.OrderByDescending(x=x.Score)
.Take(10)
.Select((p,r)=>$“秩{r+1}:{p.Name}:{p.Score}”);
lstScore.Items.Clear();
foreach(分拣层中的var p)lstScore.Items.Add(p);
}

阅读您的文件并交出玩家,然后使用OrderBy操作符链接:

private IEnumerable<Player> ReadPlayers(TextReader rd){
  string line;
        while ((line = sr.ReadLine()) != null)
        {
            string[] s = line.Split(';');
            string name = s[0];
            int score = int.Parse(s[1]);
            yield return new Player(name, score);
        }
}

private void Scores_Load(object sender, EventArgs e)
{
    string filename = "highscores.txt";
    using (StreamReader sr = File.OpenText(filename)){ 
      var sortedPlayers= ReadPlayers(rd)
                             .OrderByDescending(x=x.Score)
                             .Take(10)
                             .Select((p,r)=>$"rank {r+1}:{p.Name} : {p.Score}");
       lstScore.Items.Clear();
       foreach(var p in sortedPlayers) lstScore.Items.Add(p); 
    }
private IEnumerable ReadPlayer(TextReader rd){
弦线;
而((line=sr.ReadLine())!=null)
{
字符串[]s=line.Split(“;”);
字符串名称=s[0];
int score=int.Parse(s[1]);
返回新玩家(姓名、分数);
}
}
私有无效分数加载(对象发送方,事件参数e)
{
字符串filename=“highscores.txt”;
使用(StreamReader sr=File.OpenText(filename)){
var sortedPlayers=ReadPlayers(rd)
.OrderByDescending(x=x.Score)
.Take(10)
.Select((p,r)=>$“秩{r+1}:{p.Name}:{p.Score}”);
lstScore.Items.Clear();
foreach(分拣层中的var p)lstScore.Items.Add(p);
}

看起来像是将分数存储和排序为字符串。可以按int值排序:var sorted=players.OrderBy(p=>Int32.Parse(p.Score)).ToList();仍然不起作用,但没关系,我只需要第10位,所以我添加了if语句,在索引9上插入第10个播放器,现在它可以工作了!看起来可以将分数作为字符串存储和排序。可以按int值排序:var sorted=players.OrderBy(p=>Int32.Parse(p.Score)).ToList();不知何故仍然不起作用,但没关系,我只需要第10名,所以我添加了if语句,在索引9中插入第10名,现在它起作用了!