惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
A
About on SuperTechFans
Vercel News
Vercel News
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
S
SegmentFault 最新的问题
V
Visual Studio Blog
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
Apple Machine Learning Research
Apple Machine Learning Research
GbyAI
GbyAI
美团技术团队

博客园 - 我有我奥妙

【BenchmarkDotNet】测试多方式的对象映射 【自动注入】.NET8/.NETCore 依赖注入:自动注入项目中所有接口和自定义类 【Quartz】.Net8使用定时任务 【模型验证】未被异常捕获到 【Ant Design Vue】相关 【根节点】C#找树形数据的根节点Id 【C#】枚举值 【ECharts】图表自定义显示标题 【消息队列】介绍 【Nginx】Windows部署Vue 设计模式(一)-介绍 【.NetCore】创建本机的静态文件服务器 NLog(一)-使用示例 【nssm】windows上netcore注册为服务 【字符串排序】C#和前端js排序问题 【长路经】C#读取文件抛出FileNotFoundException异常 【RestSharp】常用的几个请求方式 【笔记软件】Obsidian的使用 【浏览器扩展】编写Firefox和Chrome的扩展程序
【排名】处理同分数的排名
我有我奥妙 · 2025-04-20 · via 博客园 - 我有我奥妙

实体类

    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}");
            }
        }

运行结果

如图