2013-04-19 37 views
8

Tôi đang cố tìm ra cách để xếp hạng các mục trong danh sách và giữ kết quả trong một đối tượng hoặc danh sách khác. Tôi biết về phương thức orderby, nhưng tôi không biết làm thế nào để tạo ra một số thứ tự tương ứng cho mỗi mục.Xếp hạng các mục trong danh sách với LINQ

Ví dụ:

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

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

và sau đó lưu trữ các kết quả từ một trong hai thấp đến cao hoặc từ cao xuống thấp ở đây:

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

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

Bất kỳ giải pháp thông qua LINQ?

+0

Bạn cần phải giữ gìn trật tự ban đầu? – Polity

+0

Không, chỉ là một loại xếp hạng. –

+0

Số trùng lặp có cùng thứ hạng không? –

Trả lời

12

này nên làm điều đó:

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

Để xếp hạng thứ tự tăng dần (tức là số thấp nhất đầu tiên), sau đó chỉ cần thay thế OrderByDescending bởi OrderBy.

+6

Không nên sao chép các hàng có cùng số? Nếu bạn thêm ** 650 ** vào danh sách. Nó kết quả với các xếp hạng '1 2 3 ..' nơi nó sẽ là' 1 1 3 ..' –

17

Một trong những tình trạng quá tải của các phương pháp Select phần mở rộng trở lại chỉ số:

dự án mỗi phần tử của một chuỗi thành một hình thức mới bằng cách kết hợp chỉ số của phần tử.

Bạn có thể sử dụng nó để làm cho thứ hạng của bạn:

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 

Hoặc, trong C# http://dotnetfiddle.net/3ZGeJ1

Các vấn đề liên quan