2013-02-02 11 views
5

Mam List<string> z datami.
Moja lista jest:Sortuj ciąg znaków z datami w C#

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

Chcę, aby posortować listę wyglądać tak:

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

Jak mogę to zrobić?

Odpowiedz

14

z 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

Co powiesz na niepoprawny ciąg datetime? Czy istnieje sposób na zmianę tej niepoprawnej daty z określonym ciągiem znaków? –

4

Nie należy stosować reprezentacje ciąg danych - Wszyscy żyjemy w obiektowego świata :)

Najlepszy sposób byłoby przekonwertować te ciągi do rzeczywistych obiektów DateTime i sortować je w odwrotnej kolejności poprzez LINQ :

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

Innym sposobem byłoby wdrożenie niestandardowych funkcji sortowania, zobacz this link. Wtedy po prostu używać go w funkcji sortowania:

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

+1 ponieważ nie przeszkadzało z porównania ciągów jak ja :) –

+0

faktycznie, nie trzeba lambda, można zrobić to w ten sposób -Array.ConvertAll (dateStrings, DateTime.Parse) – himanshupareek66

0

Ponieważ są one format UK/AUS (dzień/miesiąc/rok) można sortować je przy użyciu 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); 

Osobiście Chciałbym przekonwertować je na DateTime obiektów pierwszych ..

0

W hy chcesz użyć List<string> zamiast List<DateTime>?

List<DateTime> dates = ... 

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

Jestem pewien, że miał swoje powody. Ja też tego potrzebuję, na przykład. –

1

Spróbuj tego:

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