2016-12-25 101 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 

我要的是得到其中key ==「mykey1」的時期訂購的價值。

我試過如下..

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

是其運行週期爲字符串,你從2013-10 2013-3之前獲得的數據2013-12。

+0

我建議如果可能的話你的月經存儲爲'DateTime'。所以你沒有在每個查詢中解析的開銷。 –

+0

數據來自第三方,所以沒有控制那裏... – Arnab

回答

3

您可以使用

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(字符串)'的最佳重載方法匹配有一些無效的參數也許是因爲在我的情況下期間沒有一天的價值..解析方法還需要第二個參數FormatProvider和第三個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" 

因此,這將令預期該列表。