2013-04-19 19 views
8

Sto cercando di capire un modo per classificare gli elementi in un elenco, e tenere i risultati in un oggetto o un altro elenco. Conosco il metodo orderby, ma non so esattamente come fare per creare un numero di rank corrispondente per ogni oggetto.elementi classifica in un elenco con LINQ

Ad esempio:

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

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

e quindi memorizzare il risultato sia da basso ad alto o alto a basso qui:

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

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

Eventuali soluzioni tramite LINQ?

+0

Avete bisogno di preservare l'ordine originale? – Polity

+0

No, solo un tipo di classifica. –

+0

I numeri duplicati dovrebbero avere lo stesso valore? –

risposta

12

Questo dovrebbe farlo:

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

Per classificare in ordine crescente (cioè il numero più basso prima), poi basta sostituire OrderByDescending da OrderBy.

+6

Non dovrebbe duplicare i ranghi degli stessi numeri? Se aggiungi ** 650 ** all'elenco. Risulta con ranghi '1 2 3 ..' dove dovrebbe essere' 1 1 3 ..' –

17

Uno del sovraccarico del metodo Select estensione restituire l'indice:

Progetti ogni elemento di una sequenza in una nuova forma incorporando l'indice dell'elemento.

Si può usare per rendere il vostro rank:

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

Oppure, in C# http://dotnetfiddle.net/3ZGeJ1

Problemi correlati