使用C#中的日期对字符串列表进

时间:2013-02-02 23:39:08

标签: c# list sorting date

我有List<string>日期 我的名单是:

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

我想将列表排序为:

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

我该怎么做?

6 个答案:

答案 0 :(得分:23)

使用linq:

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

更新(根据评论中的问题):

您可以将此类无效日期视为无效日期(无效日期被视为default(DateTime)):

var list = new List<string> { "01/01/2013", "10/01/2013", "N/A" , "20/01/2013"  };
var orderedList2 = list.OrderByDescending(x =>
            {
                DateTime dt;
                DateTime.TryParse(x, out dt);
                return dt;
            });

或者,如果您希望将无效的日期时间作为列表中的第一项:

var orderedList3 = list.OrderByDescending(x =>
            {
                DateTime dt;
                if (!DateTime.TryParse(x, out dt)) return DateTime.MaxValue;
                return dt;
            }); 

您还可以过滤无效日期:

var filteredList = list.Where(x =>
            {
                DateTime dt;
                return DateTime.TryParse(x, out dt);
            }).Select(DateTime.Parse).OrderByDescending(x => x);

答案 1 :(得分:4)

你不应该使用数据的字符串表示 - 我们都生活在面向对象的世界中:)

最好的方法是将这些字符串转换为实际的DateTime对象,并通过linq以相反的顺序对它们进行排序:

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

另一种方法是实现自定义排序功能,请参阅this link。然后你只需在排序函数中使用它:

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

答案 2 :(得分:3)

试试这个:

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

答案 3 :(得分:0)

因为它们是英国/ AUS格式(日/月/年),您可以使用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);

我个人首先会将它们转换为DateTime个对象..

答案 4 :(得分:0)

为什么要使用List<string>代替List<DateTime>

List<DateTime> dates = ...

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

答案 5 :(得分:0)

要将自定义格式的DateTime字符串转换为统一格式的string,可以采用以下简单的safe代码段。

    string formatStr = "yyyyMMddHHmmss";
    string result = Convert.ToDateTime(inputStr).ToString(formatStr);

在代码中,formatStr可以是DateTime类可以接受的任何形式,可以将其设置为所需的格式,在这里您只需使用匹配的dd/MM/yyyy使用您的目标格式字符串,例如“ 20/01/2013”​​。

因此,对于您的情况,代码可以很简单,如下所示:

    List<string> list = new List<string> { "01/01/2013", "10/01/2013", "20/01/2013" };
    var listAfterSorting = list.OrderByDescending(t => 
        Convert.ToDateTime(t).ToString("dd/MM/yyyy")
            .ToList());

在某些情况下,使用ParseExact解析数据时间字符串时,它将引发错误/异常String was not recognized as a valid DateTime,在这种情况下,如果您使用TryParseExact,则结果是可能是default(DateTime) = 1/1/0001 12:00:00 AM,因为解析失败。因此,我不建议使用ParseExactTryParseExact