【排名】处理同分数的排名
实体类
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}");
}
}
运行结果
如图


浙公网安备 33010602011771号