c# - Linq 用于使用 group 和 orderby 计算排名

标签 c# linq

我正在尝试计算对象的排名。由于多个对象可以具有相同的分数,我需要将它们分组,以便它们获得相同的排名。

public class RankedItem {

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

  public RankedItem(string name, int score) {
     Name = name;
     Score = score;
  }

}

public void CalculateRanks() {

  List<RankedItem> items = new List<RankedItems> {
    new RankedItem("A", 3),
    new RankedItem("B", 2),
    new RankedItem("C", 3),
    new RankedItem("D", 1),
    new RankedItem("E", 2)
  };
 
  IOrderedEnumerable<IGrouping<int, RankedItems>> rankedItems = items.GroupBy(i => b.Score).OrderBy(g => g.Key);

  
}

现在如何设置排名,以便将排名1分配给最高分?

最佳答案

这里基本上有两个选择。 Linq 或循环。对于这两个选项,您应该使用OrderByDescending,因为您的分数排名关系是相反的。然后你可以使用索引+1来分配排名。

  1. 循环。

对于此选项,您需要一个集合来保存可以使用索引 [ ] 运算符进行迭代的分组。这在 IOrderedEnumerable 中是不可能的。所以我建议使用 List:

List<IGrouping<int, RankedItem>> rankedItems = items.GroupBy(b => b.Score)
                                                    .OrderByDescending(g => g.Key)
                                                    .ToList();

现在,您可以简单地循环遍历具有索引的列表,然后再次循环遍历每个组的所有元素,以使用索引来分配排名:

for (int i = 0; i < rankedItems.Count(); i++)
{
    IGrouping<int, RankedItem> grouping = rankedItems[i];
    foreach (var element in grouping)
    {
        element.Rank = i + 1;
    }
}
  • LINQ:
  • 使用此Select中的索引重载语句并使用构造函数创建新对象:

    List<RankedItem> rankedItems = items.GroupBy(b => b.Score)
                                        .OrderByDescending(g => g.Key)
                                        .SelectMany((item, index) => item.Select(inner => 
                                                new RankedItem(inner.Name, item.Key) {Rank = index + 1})
                                        ).ToList();
    

    结果:

    enter image description here

    关于c# - Linq 用于使用 group 和 orderby 计算排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65179665/

    相关文章:

    c# - 使用相同数据库问题的 Web 和 Windows 窗体应用程序

    c# - 将 curl 效果应用于静态图像 C#

    c# - 如何在 asp.net 中按顺序从目录中获取文件?

    c# - 如何从 HttpResponse 编码二进制 PDF?

    c# - 扩展方法冲突

    c# - c#中如何将DataTable中的值转换为字符串数组

    c# - 将类型作为参数传递给 LINQ Field 方法

    c# - 根据编号拆分字符串列表

    c# - 表达式树 - 不必要的转换为 int32

    c# - 我的表单上有一个按钮,单击后会运行更新 sql 来更新数据库上的忠诚度积分,但它不会更新