2016-12-19 55 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]) 
})