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

本文关键字:项目 LINQ 列表 使用 | 更新日期: 2023-09-27 18:09:54

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

例如:

List<int> numbers = new List<int>();
numbers.Add(650);
numbers.Add(150);
numbers.Add(500);
numbers.Add(200);

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

public class NumberRank
{
    public int Number {get; set;}
    public int Rank {get; set;}
    public NumberRank(int number)
    {
        Number = number;
        Rank = ????????;
    }
}

通过LINQ有什么解决方案吗?

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

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));

这应该做到:

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();  
   }
}

要按升序排列(即,先按最低数字排列(,只需将OrderByDescending替换为OrderBy。

Function Rank(Of T As IComparable)(list As IEnumerable(Of T), item As T) As Integer
    Return list.Count(Function(x) x.CompareTo(item) < 0) + 1
End Function
Public Sub Main()
    Dim l = New Integer() {9, 1, 3, 8, 4, 6}
    Console.WriteLine("6 is the " & Rank(l,6) & "th element of ")
    Console.WriteLine([String].Join(" ", l))
End Sub
6 is the 4th element of
9 1 3 8 4 6

或者,在C#中http://dotnetfiddle.net/3ZGeJ1