2016-12-19 8 views
0

"Year"として項目の1つを持つリスト "Sites"があります。これは文字列として定義され、 "MM/yyyy"の形式です。 「年」のための のデータは、私は文字列を変換し、それをソートするDateTime.Parseを使用できることを理解文字列を分割して並べ替える - Linq

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

です。しかし、私は文字列を分割し、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]) 
}) 
関連する問題