我正在尝试根据玩家的用户名和从文本文件读取的分数,在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/

10-10 18:18
查看更多