我正在尝试根据玩家的用户名和从文本文件读取的分数,在C#Windows窗体中创建十大排行榜。
例如。文本文件中的行数:Denna~21
到目前为止,这是我的代码:
private void scrnLeaderboard_Load(object sender, EventArgs e)
{
string[] players = FileMethods.ReadLines();
// Create List<KeyValuePair> to hold all player usernames and scores
List<KeyValuePair<int, string>> playerNamesScores = new List<KeyValuePair<int, string>>();
foreach (var item in players)
{
string[] playerDetails = item.Split('~');
if (playerDetails.Length == 2)
// Player's username and score added to List<KeyValuePair> playersNamesScores
// Key is score, Value is username
playerNamesScores.Add(new KeyValuePair<int, string>(Convert.ToInt32(playerDetails[1]), playerDetails[0].ToString()));
}
// Sorting the scores in descending order
var sortedScores = playerNamesScores.OrderByDescending(x => x).ToList<KeyValuePair<int, string>>();
// Assigning the appropriate values to each label's text on the leaderboard
lblPos1.Text = String.Format("{0}: \t{1}", sortedScores[0].Value, sortedScores[0].Key);
lblPos2.Text = String.Format("{0}: \t{1}", sortedScores[1].Value, sortedScores[1].Key);
lblPos3.Text = String.Format("{0}: \t{1}", sortedScores[2].Value, sortedScores[2].Key);
lblPos4.Text = String.Format("{0}: \t{1}", sortedScores[3].Value, sortedScores[3].Key);
lblPos5.Text = String.Format("{0}: \t{1}", sortedScores[4].Value, sortedScores[4].Key);
lblPos6.Text = String.Format("{0}: \t{1}", sortedScores[5].Value, sortedScores[5].Key);
lblPos7.Text = String.Format("{0}: \t{1}", sortedScores[6].Value, sortedScores[6].Key);
lblPos8.Text = String.Format("{0}: \t{1}", sortedScores[7].Value, sortedScores[7].Key);
lblPos9.Text = String.Format("{0}: \t{1}", sortedScores[8].Value, sortedScores[8].Key);
lblPos10.Text = String.Format("{0}: \t{1}", sortedScores[9].Value, sortedScores[9].Key);
}
FileMethods.ReadLines()就是这样:
string filepath = @"previousPlayers.txt";
string[] players = File.ReadLines(filepath).ToArray();
return players;
每次编译代码时,都会出现此错误,
“至少一个对象必须实现IComparable。”,
在这条线上:
var sortedScores = playerNamesScores.OrderByDescending(x => x).ToList<KeyValuePair<int, string>>();
我不确定这是什么意思,或者如何使我的代码工作。
任何帮助深表感谢!
最佳答案
OrderByDescending
方法通过键选择器返回的键对项目进行排序(此方法的第一个参数)。然后,它使用各个项目的这些键将一个项目与另一个进行比较,以确定哪个项目先出现,然后再出现。默认情况下,它使用由项实现的IComparable
接口方法进行此比较。但是,您指定了x => x
作为键选择器,该选择器返回的类型为KeyValuePair<int, string>
的对象,该对象未实现IComparable
。因此,无法对它们进行排序,并且会收到“至少一个对象必须实现IComparable”错误。
由于您所需要做的只是按分数排序(类型为int
),并且int
实现IComparable
,因此您可以简单地使用返回分数的选择器:
var sortedScores = playerNamesScores.OrderByDescending(x => x.Key).ToList<KeyValuePair<int, string>>();
如果需要更复杂的项目排序方式(例如,您需要以相同的分数对剧本进行字母排序),则可以声明实现
IComparer<KeyValuePair<int, string>>
接口的类,并将其实例作为OrderByDescending
方法的第二个参数传递。关于c# - C#Windows窗体:使用List <KeyValuePair>创建前10名排行榜,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47371037/