【排名】处理同分数的排名

实体类

    public class UserScore
    {
        public string Name { get; set; }
        public double TotalScore { get; set; }
        public int Ranking { get; set; }
        public int ThanUserNumber { get; set; }
        public double ThanUserRate { get; set; }
    }

测试方法

        static void Test()
        {
            List<UserScore> userScoreStats = new List<UserScore>
            {
                new UserScore { Name = "张三A", TotalScore = 23.5d, },
                new UserScore { Name = "张三B", TotalScore = 23.5d, },
                new UserScore { Name = "张三C", TotalScore = 18.1d, },
                new UserScore { Name = "张三D", TotalScore = 79.3d, },
                new UserScore { Name = "张三E", TotalScore = 37.2d, },
                new UserScore { Name = "张三F", TotalScore = 49.5d, },
                new UserScore { Name = "张三G", TotalScore = 97.9d, },
                new UserScore { Name = "张三H", TotalScore = 3.1d, },
            };

            int UserNumber = userScoreStats.Count;

            userScoreStats = userScoreStats.OrderByDescending(x => x.TotalScore).ThenBy(x => x.Name).ToList();

            //更新排名、占比
            double temp = -1;                        //临时变量
            int num = 0;                            //自然排序变量
            int final_num = 0;                    //最终排名变量
            int temp_num = 0;                        //临时增量
            for (int i = 0; i < userScoreStats.Count; i++)
            {
                var str = userScoreStats[i].TotalScore;//当前循环的出勤率
                                                       //如果临时变量和错误率相等 说明本次错误率和上次是一致的 那么排名也应该和上次一样,但是要记录这种情况出现几次,最后如果当前排名不和上次一致时需要将排名加上空挡的增量
                if (temp == str)
                {
                    temp_num++;                     //相等时记录增量  有几条一样的排名
                    final_num = num;               //将排名赋值成和上一次排名一样    
                }
                else
                {
                    num++;                            //不相等时 排名自然增加    
                    final_num = num + temp_num;         //最终排名为自然排名加上之前的相等记录增量
                    num = final_num;                  //将自然排名设置为最终排名的数上    
                    temp_num = 0;                       //记录相等排名的增量置空    
                }
                temp = str;                           //用个临时变量去记录上次的错误率   

                var currRateCount = userScoreStats.Where(x => x.TotalScore == str).Count();//当前率的个数

                var Ranking = final_num;//排名,会并列
                var ThanUserNumber = UserNumber - final_num - currRateCount + 1;//超越多少人

                userScoreStats[i].Ranking = Ranking;
                userScoreStats[i].ThanUserNumber = ThanUserNumber;
                double ThanPeronRate = 0;
                if (UserNumber > 0)
                {
                    ThanPeronRate = (double)userScoreStats[i].ThanUserNumber / UserNumber;
                    ThanPeronRate = ThanPeronRate * 100;
                    ThanPeronRate = ThanPeronRate.ToChineseDouble();
                }
                userScoreStats[i].ThanUserRate = ThanPeronRate;
            }

            var query = userScoreStats.OrderBy(x => x.Ranking).ToList();
            foreach (var item in query)
            {
                Console.WriteLine($"{item.Name}\t{item.TotalScore}\t{item.Ranking}\t{item.ThanUserNumber}\t{item.ThanUserRate}");
            }
        }

运行结果

如图

posted @ 2025-04-20 22:16  我有我奥妙  阅读(19)  评论(0)    收藏  举报