2010-06-17 34 views
66

Làm cách nào để sắp xếp danh sách chung DESC và ASC? Với LINQ và không có LINQ? Tôi đang sử dụng VS2008.Tôi có thể sắp xếp danh sách chung DESC và ASC bằng cách nào?

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<int> li = new List<int>(); 

     li.Add(456); 
     li.Add(123); 
     li.Add(12345667); 
     li.Add(0); 
     li.Add(1); 

     li.Sort(); 

     foreach (int item in li) 
     { 
      Console.WriteLine(item.ToString() + "\n"); 
     } 

     Console.ReadKey(); 
    } 
} 

Trả lời

158

Với LINQ

var ascendingOrder = li.OrderBy(i => i); 
var descendingOrder = li.OrderByDescending(i => i); 

Without LINQ

li.Sort((a, b) => a.CompareTo(b)); // ascending sort 
li.Sort((a, b) => -1* a.CompareTo(b)); // descending sort 

Lưu ý rằng nếu không có LINQ, danh sách riêng của mình đã được sắp xếp. Với Linq, bạn đang nhận được một thứ tự liệt kê danh sách nhưng bản thân danh sách đã không thay đổi. Nếu bạn muốn biến danh sách, bạn sẽ thay đổi phương pháp LINQ to cái gì đó như

li = li.OrderBy(i => i).ToList(); 
+1

@onedaywhen Nếu bạn cảm thấy câu trả lời của người dùng khác không chính xác, bạn nên bình luận, bỏ phiếu và/hoặc cung cấp câu trả lời mà bạn cảm thấy là chính xác, chứ không phải chỉnh sửa câu trả lời của người khác là đúng. – Servy

+12

Tôi nghĩ rằng đối với thứ tự giảm dần thì rõ ràng hơn là sử dụng 'li.Sort ((a, b) => b.CompareTo (a));' so với phương thức '-1 *' được sử dụng ở đây. Tôi đã chỉnh sửa câu trả lời cho phù hợp nhưng @Servy đã hoàn nguyên nó. – onedaywhen

+0

@Servy: Tôi nghĩ câu trả lời là chính xác về mặt vật chất nhưng trong một trường hợp đã sử dụng một số logic hơi lạ. [Faq for editing] (http://stackoverflow.com/help/privileges/edit) nói, "Một số lý do phổ biến để chỉnh sửa [include] ... để sửa lỗi nhỏ." Vì vậy, nó xuất hiện rằng "chỉnh sửa câu trả lời của người khác để được những gì bạn nghĩ là chính xác" được khuyến khích (không được đăng ký, như bạn đề nghị). – onedaywhen

13

với ra LINQ, sử dụng Sort() và sau đó Reverse() nó.

48

Without LINQ:

Tăng dần:

li.Sort(); 

dần:

li.Sort(); 
li.Reverse(); 
+0

'Sort()' là một phương thức void, vì vậy bạn không thể chuỗi 'Reverse()' theo cách này. Bạn sẽ cần 2 hoạt động riêng biệt. Tuy nhiên, với LINQ bạn có thể chuỗi nó vào một 'OrderBy' nhưng tại thời điểm đó bạn chỉ nên sử dụng' OrderByDescending' thay thế. –

+0

@Ahmad Mageed. Ofcourse ... Cuối buổi chiều meltdown ... :( –

+0

Điều này là đơn giản và làm việc cho tôi, và mã phân loại hiện tại của tôi –

-1

cách Rất đơn giản để sắp xếp Danh sách với int giá trị theo thứ tự giảm dần:

li.Sort((a,b)=> b-a); 

Hope cái này giúp!

+3

Đây không phải là những gì 'int.CompareTo (int)' không cửa một lý do. tại referencesource.microsoft.com] (http://referencesource.microsoft.com/#mscorlib/system/int32.cs,225942ed7b7a3252) có nội dung: "* Cần sử dụng so sánh vì phép trừ sẽ được tính thành số dương cho các số âm rất lớn, vv * ". Nếu bạn có' b = int.MinValue' và 'a = 1' (nói), điều này sẽ thất bại.Đôi khi một cuộc gọi phương thức đáng giá. –

+0

* vì lý do ... –

+0

Câu hỏi nói về danh sách chung sắp xếp. "-" hoạt động thậm chí sẽ không biên dịch cho nhiều loại. Và đối với tập hợp các loại, bạn có thể có lỗi tràn số như được đề cập trong nhận xét trước –

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