2013-02-02 47 views
5

Tôi có một số List<string> có ngày.
danh sách của tôi là:Sắp xếp danh sách chuỗi có ngày trong C#

{"01/01/2013","10/01/2013","20/01/2013"} 

Tôi muốn sắp xếp danh sách để trông như thế này:

{"20/01/2013","10/01/2013","01/01/2013"} 

Làm thế nào tôi có thể làm điều này?

Trả lời

14

với LINQ:

var list = new List<string> {"01/01/2013", "10/01/2013", "20/01/2013"}; 
var orderedList = list.OrderByDescending(x => DateTime.Parse(x)).ToList(); 
+0

Làm thế nào về nếu có một chuỗi datetime không hợp lệ? Có cách nào để thay đổi ngày giờ không hợp lệ đó bằng một chuỗi cụ thể không? –

4

Bạn không nên sử dụng cơ quan đại diện chuỗi dữ liệu - tất cả chúng ta đang sống trong hướng đối tượng thế giới :)

Cách tốt nhất sẽ phải chuyển đổi những chuỗi thành các đối tượng DateTime thực tế và sắp xếp chúng theo thứ tự ngược lại thông qua LINQ :

var dates = Array.ConvertAll(dateStrings, x => DateTime.Parse(x)); 
return dates.OrderByDesc(x => x); 

Một cách khác là triển khai chức năng sắp xếp tùy chỉnh, xem this link. Sau đó, bạn chỉ muốn sử dụng nó trong một chức năng sắp xếp:

DateAsStringComparer myComparer = new DateAsStringComparer(); 
dateStrings.Sort(myComparer); 
+0

+1 vì bạn đã không bận tâm với việc so sánh chuỗi như tôi đã làm :) –

+0

trên thực tế, bạn không cần lambda, bạn có thể làm điều đó như thế này -Array.ConvertAll (dateStrings, DateTime.Parse) – himanshupareek66

0

Bởi vì họ là những định dạng UK/AUS (ngày/tháng/năm), bạn có thể sắp xếp chúng bằng cách sử OrderByDescending:

List<string> dates = new List<string>() { "01/01/2013", "10/01/2013", "20/10/2013" }; 

foreach (var date in dates.OrderByDescending(x => x)) 
    Console.WriteLine(date); 

Cá nhân tôi sẽ chuyển đổi chúng sang DateTime đối tượng đầu tiên ..

0

W bạn có muốn sử dụng List<string> thay vì List<DateTime> không?

List<DateTime> dates = ... 

dates.OrderByDescending(c => c).ToList(); 
+0

Tôi chắc rằng anh ta có lý do của mình. Tôi cần nó là tốt, ví dụ. –

1

Hãy thử điều này:

List<string> s = new List<string>() { "01/01/2013", "10/01/2013", "20/01/2013" }; 
var d = s.OrderByDescending(i => DateTime.ParseExact(i, "dd/MM/yyyy", null)); 
Các vấn đề liên quan