使用LINQ对列表中的项目进行排名

8 .net c# linq

我试图找出一种方法来对列表中的项目进行排名,并将结果保存在对象或其他列表中.我知道orderby方法,但我不知道如何为每个项目创建相应的排名.

例如:

List<int> numbers = new List<int>();

numbers.Add(650);
numbers.Add(150);
numbers.Add(500);
numbers.Add(200);
Run Code Online (Sandbox Code Playgroud)

然后在这里存储从低到高或从高到低的结果:

public class NumberRank
{
    public int Number {get; set;}
    public int Rank {get; set;}

    public NumberRank(int number)
    {
        Number = number;
        Rank = ????????;
    }
}
Run Code Online (Sandbox Code Playgroud)

通过LINQ的任何解决方案?

Cyr*_*don 17

Select扩展方法的一个重载返回索引:

通过合并元素的索引,将序列的每个元素投影到新的形式中.

您可以使用它来获得排名:

public class NumberRank
{
    public int Number {get; set;}
    public int Rank {get; set;}

    public NumberRank(int number, int rank)
    {
        Number = number;
        Rank = rank;
    }
}

List<int> numbers = new List();

numbers.Add(650);
numbers.Add(150);
numbers.Add(500);
numbers.Add(200);

numbers.OrderBy(n => n)
       .Select((n, index) => new NumberRank(n, index));
Run Code Online (Sandbox Code Playgroud)


iam*_*mCR 12

这应该这样做:

public class NumberRank
{
   public int Number {get; set;}
   public int Rank {get; set;}

   public NumberRank(int number, int rank)
   {
      Number = number;
      Rank = rank;
   }
}

class Test
{
   static void Main()
   {
      List<int> numbers = new List<int>();

      numbers.Add(650);
      numbers.Add(150);
      numbers.Add(500);
      numbers.Add(200);

      List<NumberRank> numberRanks = numbers.OrderByDescending(n => n).Select((n, i) => new NumberRank(n, i + 1)).ToList();

      // check it worked
      foreach(NumberRank nr in numberRanks) Console.WriteLine("{0} : {1}", nr.Rank, nr.Number);
      Console.ReadKey();  
   }
}
Run Code Online (Sandbox Code Playgroud)

要按升序排列(即最低编号,请先按顺序排列),然后按OrderBy替换OrderByDescending.

  • 它不应该重复相同数字的行列吗?如果您将**650**添加到列表中.它的排名是"1 2 3 ..",它应该是"1 1 3 .." (8认同)