2016-12-25 6 views
0

私は私が何をしたい形式注文奇妙なデータLINQ

period  key  value 
"2013-3"  mykey1 5 
"2013-4"  mykey1 6 
. 
. 
. 
"2013-10" mykey1 15 
"2013-11" mykey1 25 
"2013-12" mykey1 6 

を以下に動的オブジェクトのリストを持っているが、キー==「mykey1」は期間によって順序付けされた値を取得することです。私は以下のようにしようとした

..

data.Where(w => w.key == "mykey1").OrderBy(i => i.period).Select(s => s.value).ToArray(); 

は何が起こるかは、期間が文字列であるとして、あなたは2013から3の前に2013から12に2013から10からデータを取得しています。

+0

を使用することができます。したがって、各クエリで解析するオーバーヘッドはありません。 –

+0

データがサードパーティから来ているのでコントロールはありません... – Arnab

答えて

3

あなたは、私が可能な場合DateTime` `として、あなたの期間を保存することをお勧め

data.Where(w => w.key == "mykey1").OrderBy(i => DateTime.ParseExact(i.period, "yyyy-M", 
             System.Globalization.CultureInfo.InvariantCulture)).Select(s => s.value).ToArray(); 
+0

'System.DateTime.ParseExact(string、string、System.IFormatProvider)'に最適なオーバーロードされたメソッドがいくつかの無効な引数を持っています – Arnab

+0

"yyyy-M"を試してみました – Arnab

+0

yyyy-MMの変更をyyyy-Mに変更しました。それでも同じエラーです。 – Arnab

1

stringの値はDateではないためです。

OrderBy句で日付に値を解析しようとすることがあります。

のような何か:

data.Where(w => w.key == "mykey1") 
    .OrderBy(i => DateTime.Parse(i.period)).Select(s => s.value).ToArray(); 
+0

それはエラーをスローします 'System.DateTime.Parse(string)'に最適なオーバーロードされたメソッドマッチは、 parseメソッドは、2番目のパラメータFormatProviderと3番目のDateTimeStylesも取ります。任意のヘルプを追加しますか? – Arnab

+1

はい@Arnab私はサンプルを説明していました、TryParseメソッドまたは事前チェックがあなたのためにトリックを行います。ご不便おかけしてすみません。 –

0

することができますゼロでパッド。このような何か:

data.Where(w => w.key == "mykey1").OrderBy(i => i.period.PadLeft(i.period.Max(x => x), '0')) 
    .Select(s => s.value).ToArray(); 

パッドの結果は次のようになります。

"02013-3", 
"02013-4", 
"2013-10", 
"2013-11", 
"2013-12" 

そしてそれは意志注文このリスト予想通り。