我试图找到一种合适的方法来排序一个字符串数组,其中包含按日期降序排列的日期。
例如我的列表包含:
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();
感谢您的帮助
答案 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());
^^^^^^^^^^^