8
votes

Classement des éléments dans une liste avec Linq

J'essaie de trouver un moyen de classer des éléments dans une liste et de conserver les résultats dans un objet ou une autre liste. Je connais la méthode des ordonnances, mais je ne sais pas exactement comment créer un numéro de rang correspondant pour chaque article.

Par exemple: p>

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

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


4 commentaires

Avez-vous besoin de préserver l'ordre d'origine?


Non, juste un type de classement.


Les numéros en double ont-ils le même rang?


@ user1512559 Avez-vous pu obtenir une solution? J'ai un défi similaire.


3 Réponses :


18
votes

L'une des surcharges du Sélectionnez la méthode d'extension Retourner l'index:

Projetons chaque élément d'une séquence dans une nouvelle forme en incorporant l'index de l'élément.

Vous pouvez l'utiliser pour faire votre rang: xxx


0 commentaires

12
votes

Ceci devrait le faire:

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


1 commentaires

Cela ne devrait-il pas dupliquer les rangs des mêmes numéros? Si vous ajoutez 650 à la liste. Il en résulte avec les rangs 1 2 3 .. où il devrait comme 1 1 3 ..



1
votes
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
Or, in C# http://dotnetfiddle.net/3ZGeJ1

0 commentaires