根据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++;
}
}
我有一个排行榜页面,显示用户、分数和排名。我正在尝试根据排序的用户分数显示排名。我已经尝试了我在网上找到的解决方案,排序工作正常,但所有用户的排名显示为 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++;
}
}