按日期降序排序包含日期的字符串数组

时间:2014-10-14 19:21:14

标签: c#

我试图找到一种合适的方法来排序一个字符串数组,其中包含按日期降序排列的日期。

例如我的列表包含:

page1.aspx_12-05-2013.aspx
page2.aspx_12-04-2010.aspx
page1.aspx_17-09-2014.aspx
page1.aspx_11-01-2013.aspx

我已经设法对字符串中的日期进行排序,但我不知道如何通过保留文本来完成 这是我如何排序日期:

    List<FileInfo> fi = new List<FileInfo>();
    fi = System.IO.Directory.GetFiles(@"C:\Users\arn\Desktop\testlatestpr")
            .Select(x => new System.IO.FileInfo(x))
            .ToList();

    List<string> listofdates = new List<string>();
    foreach (var x in fi)
    {
        Console.WriteLine(x.Name.Substring(x.Name.Length - 15, 10).ToString());
        listofdates.Add(x.Name.Substring(x.Name.Length - 15, 10).ToString());
    }
    var orderedList = listofdates.OrderByDescending(x => DateTime.Parse(x)).ToList();

感谢您的帮助

4 个答案:

答案 0 :(得分:6)

将您的陈述移至OrderBy

fi.OrderByDescending(f => DateTime.Parse(f.Name.Substring(x.Name.Length - 15, 10)));

答案 1 :(得分:2)

你可以扩展你的lambda:

var orderedList = listOfItems
    .OrderByDescending(item => {
        if (item.Name.Length < 15)
            return DateTime.MinValue;

        var datePart = item.Name.Substring(item.Name.Length - 15, 10);
        DateTime date;
        if (!DateTime.TryParse(datePart, out date))
            return DateTime.MinValue;

        return date;
    })
    .ToList();

我添加了一些检查,因此如果收到意外数据,它就不会丢失。

答案 2 :(得分:1)

我可能会这样做:

Regex rxDate = new Regex( @"(?<day>\d+)-(?<month>\d+)-(?<year>\d+)\..*$" ) ;

string[] unsorted = { "page1.aspx_12-05-2013.aspx" ,
                      "page2.aspx_12-04-2010.aspx" ,
                      "page1.aspx_17-09-2014.aspx" ,
                      "page1.aspx_11-01-2013.aspx" ,
                    } ;

string[] sorted = unsorted
                  .Select( s => {
                    Match m     = rxDate.Match(s) ;
                    int   day   = m.Success ? int.Parse(m.Groups[ "day"   ].Value) : 0 ;
                    int   month = m.Success ? int.Parse(m.Groups[ "month" ].Value) : 0 ;
                    int   year  = m.Success ? int.Parse(m.Groups[ "year"  ].Value) : 0 ;
                    return new { Year=year , Month = month , Day = day , Name = s } ;
                  })
                  .OrderByDescending( x => x.Year )
                  .ThenByDescending( x => x.Month )
                  .ThenByDescending( x => x.Day   )
                  .Select( x => x.Name )
                  .ToArray()
                  ;

这样做的好处是,您不必担心标记有无效日期和其他数据问题的文件名(迟早会这样做.DAMHIKT。)正则表达式保证您可以使用变成整数,你让LINQ做它那件好事。

如果要将无效文件名排序为高而不是低,请将默认值从0更改为int.MaxValue

答案 3 :(得分:0)

您可以Substring内联。

List<string> listofdates = new List<string>();
foreach (var x in fi)
{
    Console.WriteLine(x.Name.Substring(x.Name.Length - 15, 10));
    listofdates.Add(x);
}
var orderedList = listofdates.OrderByDescending(x => DateTime.Parse(x.Name.Substring(x.Name.Length - 15, 10))).ToList();

另一个注意事项。我看到你在ToString()上正在Substring()。这不是必需的,Substring()的返回值是string

 Console.WriteLine(x.Name.Substring(x.Name.Length - 15, 10).ToString());
                                                           ^^^^^^^^^^^