2013-04-19 14 views
8

Próbuję znaleźć sposób na uszeregowanie pozycji na liście i wstrzymanie wyników w obiekcie lub na innej liście. Wiem o metodzie orderby, ale nie wiem dokładnie, jak utworzyć odpowiedni numer pozycji dla każdego przedmiotu.Pozycjonowanie pozycji na liście za pomocą LINQ

Na przykład

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

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

i zachowanie wyników z obu rosnąco lub malejąco tutaj:

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

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

żadnych rozwiązań przez LINQ?

+0

Czy trzeba zachować oryginalną kolejność? – Polity

+0

Nie, tylko typ rankingu. –

+0

Czy powielone liczby mają taką samą pozycję? –

Odpowiedz

12

ten powinien zrobić:

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

Do rangi w kolejności rosnącej (czyli najniższy pierwszy numer), a następnie po prostu zastąpić OrderByDescending przez OrderBy.

+6

Czy nie powinien on duplikować szeregów o tych samych numerach? Jeśli dodasz ** 650 ** do listy. Wynika z rangami '1 2 3 ..' gdzie powinno to być' 1 1 3 ..' –

17

Jednym z przeciążeniem sposobu Select przedłużenie powrót indeksu:

Projekty każdego elementu sekwencji w nowej postaci przez dodanie indeksu elementu.

Można go używać, aby Państwa stopień:

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 

Lub w języku C# http://dotnetfiddle.net/3ZGeJ1

Powiązane problemy