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

按年份和月份对Linq结果进行排序,linq,sorting,linqpad,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 { Ye

我正在使用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

好的,使用
DateTime.Parse
基于月份,您得到了一个新的
DateTime
,而不是
月份
。 如果你不给一年,那么今年就被拿走了

例如,对于2013年3月(或2012年),您将获得与2014年3月相对应的日期时间。 2014年3月也将是2014年3月

因此,请尝试获取Datetime的月份属性

.OrderByDescending(x => x.Year)
.ThenByDescending(x => DateTime.Parse(x.Month).Month);
顺便说一句,我会用

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

好的,使用
DateTime.Parse
基于月份,您得到了一个新的
DateTime
,而不是
月份
。 如果你不给一年,那么今年就被拿走了

例如,对于2013年3月(或2012年),您将获得与2014年3月相对应的日期时间。 2014年3月也将是2014年3月

因此,请尝试获取Datetime的月份属性

.OrderByDescending(x => x.Year)
.ThenByDescending(x => DateTime.Parse(x.Month).Month);
顺便说一句,我会用

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

您只需按分组键进行排序:

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
等。在
中选择

只需按分组键排序即可:

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
等。在
中选择

以下是有效的方法!谢谢

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();

这就是成功的原因!谢谢

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();

谢谢,但无论出于什么原因,我仍然从linqpad获得完全相同的转储和排序订单。为了试验/错误起见,我更改了月份预测以仅获取值,但我仍然获得相同的排序顺序2014 1843 2014 2 635 2014 3 957Hmmm,奇怪的是,您有一次
h
,还有一次
h
,只是一个输入错误?谢谢,但出于任何原因,我仍然从linqpad获得完全相同的转储和排序顺序。为了试验/错误起见,我更改了月份预测以仅获取值,但我仍然得到相同的排序顺序2014 1843 2014 2 635 2014 3 957Hmmm,奇怪的是,您有一次
h
,还有一次
h
,只是一个打字错误?太好了!非常感谢!完美的非常感谢!