我正在做一个项目,得分最高的人将担任职位1,下一个人将成为职位2。例如,如果两个人的得分相同,他们将给出相同的职位,但接下来的人则是其他人,例如两个得分都为65将具有相同的位置,即1,而下一个内联将不是2而是3。
这可以通过LINQ实现:
' Example user scores
Dim userScores = {
New With {.Score = 65, .Name = "Linda"},
New With {.Score = 65, .Name = "Paul"},
New With {.Score = 64, .Name = "John"},
New With {.Score = 63, .Name = "Yoko"}
}
' Transform user scores to a high score table
Dim table = _
userScores _
.OrderByDescending(Function(user) user.Score) _
.Select(Function(user, i) New With {.Index = i + 1, .User = user}) _
.GroupBy(Function(row) row.User.Score) _
.SelectMany(
Function(group)
Dim position = group.First().Index
Return group.Select(
Function(row)
Return New With {.Position = position, .User = row.User}
End Function)
End Function)
' Print results
For Each row In table
Console.WriteLine("{0} {1} {2}", row.Position, row.User.Score, row.User.Name)
Next
在这里,用户按分数排序(降序)。然后给每个用户一个索引。然后,将用户按得分分组。最后,使用SelectMany将组扁平化,并从组索引值的第一行开始分配每行的位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句