C#按分数对行进行排序
Posted
技术标签:
【中文标题】C#按分数对行进行排序【英文标题】:C# Sorting lines by score 【发布时间】:2016-02-16 12:32:14 【问题描述】:我有一个名为 Player 的类,它具有属性 name 和 score,并且在每场比赛之后,它们都使用方法 File.AppendAllText(path, content+Environment.NewLine);
写入文件中。
现在我必须在单击标签“分数”并加载新表单时将它们添加到 listBox..但我想使用我的类 Player,并将项目添加到列表或作为播放器的东西,而不仅仅是从文件中加载它们。 ..我用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++;
现在这是可以接受的,但这里的问题是我不能有两个相同的键,在这种情况下键是分数...所以我想知道如何修改它以便我可以有两个或更多相同的分数?....也许我应该使用List<>
,但我不知道如何按分数对该列表进行排序,因为我在同一行文件中有字符串 + int (name + score)?
【问题讨论】:
【参考方案1】:你可以使用列表:
List<Player> players = new List<Player>();
players.Add(new Player(name, score));
并按分数排序:
var sorted = players.OrderByDescending(p => p.Score).ToList();
【讨论】:
看起来您将分数存储和排序为字符串。您可以按 int 值排序: var sorted = player.OrderBy(p => Int32.Parse(p.Score)).ToList(); 仍然无法正常工作,但没关系,我只需要第 10 位,所以我添加了 if 语句,将第 10 个玩家插入索引 9,现在它可以工作了!【参考方案2】:读取您的文件并生成播放器,然后使用 Link 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);
【讨论】:
【参考方案3】:使用 List 代替 SortedList 并使用 OrderBy Linq 方法 (System.Linq):
public class Player
public string Name get; set;
public int Score get; set;
var topList = new List<Player>();
topList = topList.OrderBy(x => x.Score);
【讨论】:
以上是关于C#按分数对行进行排序的主要内容,如果未能解决你的问题,请参考以下文章