2016-12-19 56 views
0

我有一个列表“网站”与项目,如“年”的一个。它被定义为字符串,格式为“MM/YYYY”。 数据的“年”是分割字符串和排序 - LINQ的

01/2012 
04/2012 
01/2013 
06/2012 

我明白,我可以使用DateTime.Parse将字符串转换和排序。但我想分割字符串并使用linq进行排序。是否有可能将MM和yyyy分开排序?

回答

1

那么,在对方的回答表明,你可以做到这一点。我的答案使用匿名结构,所以排序应该更有效率。

method1Result显示什么我会做(假定该数据始终有效)。主要优点是,你必须DateTime对象,因此它会更容易使用之后。

method2Result根据问题的要求不要使用DateTime.Parse。但是,它会导致代码更长,结果可用性也会降低(如果需要将其返回,则必须将匿名结构替换为您定义的结构。)

var data = new string[] 
{ 
    "01/2012", 
    "04/2012", 
    "01/2013", 
    "06/2012", 
}; 

var method1Result = data 
    .Select(x => DateTime.Parse(x)).OrderBy(x => x); 

var method2Result = data 
    .Select(x => 
     { 
      var t = x.Split('/'); 
      return new { 
       year = int.Parse(t[1]), 
       month = int.Parse(t[0]) }; 
      }) 
    .OrderBy(x => x.year) 
    .ThenBy(x => x.month); 
1

当然,这可以轻松完成。然而,这是低效的,因为你必须做的每个比较分裂:

.OrderBy(yearMonthStr => { 
    var tokens = yearMonthStr.Split('/'); 
    return int.Parse(tokens[0]) + 100*int.Parse(tokens[1]) 
})