按年和月对Linq结果进行排序

时间:2014-04-02 13:42:48

标签: linq sorting linqpad

我使用Linqpad按年/月转储(显示)计数列表。一切似乎都很好,但对于我的生活,我无法获得正确显示的排序顺序。

var h = from x in myTable 
where x.Date >= DateTime.Parse("1/1/2013") && x.myField.EndsWith("abc")
group x by new 
{
x.Date.Value.Year,
x.Date.Value.Month
} 
into g

select new 
{  
Year = g.Select(y=>y.Date.Value.Year).First(),
Month = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(g.Select(n=>n.Date.Value.Month).First()),
Number = g.Count()
};

H.Dump().OrderByDescending(y=>y.Year).ThenBy(m=>DateTime.Parse(m.Month));

2014    January    843
2014    February   635
2014    March      957
2014    April       61
2013    May      1
2013    June      1257
2013    July      1243
2013    August     796
2013    September  341
2013    October    765
2013    November   609
2013    December   630

我试图让输出显示

2014    April       61
2014    March      957
2014    February   635
2014    January    843
2013    December   630
2013    November   609 

...

我也试过

H.Dump().OrderByDescending(y=>y.Year).ThenByDescending(m=>DateTime.Parse(m.Month));

但由于某种原因,这似乎根本不会影响月份排序。关于我做什么/理解错误的任何想法?谢谢!


我尝试删除一些复杂性并更改了我的月预测以获得月值。

Month = (g.Select(n=>n.Date.Value.Month).First())

并更新了转储

H.Dump().OrderBy(y=>y.Year).ThenByDescending(m=>m.Month);

我的回报是一样的

2014    1   843
2014    2   635
2014    3   957
2014    4   73
2013    5   1
2013    6   1257
2013    7   1243
2013    8   796
2013    9   341
2013    10  765
2013    11  609
2013    12  630

3 个答案:

答案 0 :(得分:2)

嗯,根据月份DateTime.Parse,你有一个新的DateTime,而不是month。 因为你没有给一年,所以今年将会被拿走。

例如,对于2013年3月(或2012年),您将获得与2014年3月相对应的DateTime。 2014年3月还将为您提供2014年3月。

因此,请尝试获取日期时间的月份属性!

.OrderByDescending(x => x.Year)
.ThenByDescending(x => DateTime.Parse(x.Month).Month);

顺便说一句,我会用

DateTime.ParseExact(x.Month, "MMMM", CultureInfo.CurrentCulture).Month

答案 1 :(得分:2)

您只需按分组键排序:

var h = from x in myTable 
where x.Date >= DateTime.Parse("1/1/2013") && x.myField.EndsWith("abc")
group x by new 
{
    x.Date.Value.Year,
    x.Date.Value.Month
} 
into g
orderby g.Key.Year descending, g.Key.Month descending
...

此外,您可以在Year = g.Key.Year

中使用select

答案 2 :(得分:0)

这里有什么用!感谢。

var H = from x in myTable
where x.Date >= DateTime.Parse("1/1/2013") && x.myField.EndsWith("abc")      
group x by new 
{
x.Date.Value.Year,
x.Date.Value.Month
} 
into g
orderby g.Key.Year descending, g.Key.Month descending
select new 
{
Year = g.Key.Year,
Month = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(g.Key.Month),
Number = g.Count()
};

H.Dump();