根据C#中的分数获取排名

Get the rank based on the score in C#

我有一个排行榜页面,显示用户、分数和排名。我正在尝试根据排序的用户分数显示排名。我已经尝试了我在网上找到的解决方案,排序工作正常,但所有用户的排名显示为 0。

public class Leaderboard 
{
    public string Name { get; set; }
    public int Score { get; set; }
    public int Rank { get; set; }
}

private async Task GetContacts()
{
    FireBaseHelper firebaseHelper = new FireBaseHelper();
    Leaderboard = await firebaseHelper.GetUsers();

    Leaderboard.OrderByDescending(item => item.Score).Select((item, i) => new
    {
       item = i,
       Rank = i + 1
    });
}

我不知道我做错了什么。关于如何修复它有什么想法吗?

作为 赛里利奥 说,你不能用 OrderByDescending 排序 string 如果可能,将 score 属性 类型更改为 int

我认为问题可能出在您混淆了 Rank 所在的对象。您可能误解了 Select((item, i) => new { ... }) 的作用。它为集合中的每个项目创建一个 新对象。它不会更新 集合中的项目。

我想你想做的是使用 foreach-loop:

private async Task GetContacts()
{
    FireBaseHelper firebaseHelper = new FireBaseHelper();
    Leaderboard = await firebaseHelper.GetUsers();

    var nextRank = 1;
    foreach (var user in Leaderboard.OrderByDescending(item => item.Score))
    {
        user.Rank = nextRank++;
    }
}

如果您想考虑@derpirscher 的评论...如果您希望两个得分相同的用户具有相同的排名:

private async Task GetContacts()
{
    FireBaseHelper firebaseHelper = new FireBaseHelper();
    Leaderboard = await firebaseHelper.GetUsers();

    var nextRank = 1;
    var orderedGroupedUsers = Leaderboard.GroupBy(item => item.Score)
        .OrderByDescending(group => group.Key);
    foreach (var group in orderedGroupedUsers)
    {
        var groupList = group.ToList();
        foreach (var user in groupList)
        {
            user.Rank = nextRank;
        }
        nextRank += groupList.Count;
        // Or if you don't want to skip ranks when two
        // items have the same Score:
        // nextRank++;
    }
}