我正在使用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 值。
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
,而不是一个month
。由于您不给一年,因此将采用当前年份。
例如,对于 2013 年 3 月(或 2012 年),您将获得与 2014 年 3 月对应的日期时间。2014 年 3 月也会给你 2014 年 3 月。
因此,请尝试获取日期时间的月份属性!
.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
...
此外,您可以在select
中使用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();