"Year"として項目の1つを持つリスト "Sites"があります。これは文字列として定義され、 "MM/yyyy"の形式です。 「年」のための のデータは、私は文字列を変換し、それをソートするDateTime.Parse
を使用できることを理解文字列を分割して並べ替える - Linq
01/2012
04/2012
01/2013
06/2012
です。しかし、私は文字列を分割し、linqを使用して並べ替えを行います。 MMとyyyyを分割して並べ替える可能性はありますか?
"Year"として項目の1つを持つリスト "Sites"があります。これは文字列として定義され、 "MM/yyyy"の形式です。 「年」のための のデータは、私は文字列を変換し、それをソートするDateTime.Parse
を使用できることを理解文字列を分割して並べ替える - Linq
01/2012
04/2012
01/2013
06/2012
です。しかし、私は文字列を分割し、linqを使用して並べ替えを行います。 MMとyyyyを分割して並べ替える可能性はありますか?
まあ、他の回答で示したように、あなたはそれを行うことができます。代わりに匿名の構造体を使用するので、ソートがより効率的になるはずです。
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);
これは簡単に行うことができます。あなたはそれぞれの比較上の分割を行う必要がありますので、しかし、これは、非効率的である:
.OrderBy(yearMonthStr => {
var tokens = yearMonthStr.Split('/');
return int.Parse(tokens[0]) + 100*int.Parse(tokens[1])
})