按月份名称和年份(MMM yyyy 字符串)排序
本文关键字:yyyy MMM 字符串 排序 | 更新日期: 2023-09-27 18:30:56
如何在
linq中按月份名称和年份排序,它目前按字母顺序排序,这在显示报告时会导致问题
我正在寻找 十一月 2011, 十二月 2011, 一月 2012, 二月 2012
我主要关心的是结果 MonthList,因为它是 monthlist1 和 monthlist2 之间的联合
感谢您的帮助和见解
var monthlist1 = data.
Select(x => new { wkdate = x.WKENDDATE }).
OrderBy(y => y.wkdate).
Select(m => new {
monthname = m.wkdate.ToString("MMM yyyy",
CultureInfo.CreateSpecificCulture("en-US"))
}).
Distinct().
ToList();
var monthlist2 =
data.Select(x => new { wkdate =
ExportHelper.getSplitEndDate(x.WKENDDATE).AddDays(1)})
.OrderBy(y => y.wkdate)
.Where(l => ExportHelper.isSplitWeek(l.wkdate.AddDays(-6), l.wkdate) == true)
.Select(m => new {
monthname = m.wkdate.ToString("MMM yyyy",
CultureInfo.CreateSpecificCulture("en-US"))
})
.Distinct()
.ToList();
var monthlist =
monthlist1.
Union(monthlist2).
Distinct().
OrderBy(m=> m.monthname).
ToList();
它按字母顺序排序,因为wkdate
是一个String
值而不是DateTime
。您需要先解析它:
var monthlist = monthlist1.Union(monthlist2)
.Distinct()
// monthname is a String in format MMM yyyy
.OrderBy(m => DateTime.Parse(m.monthname))
.ToList();
我假设由于您当前的wkdate
值遵循MMM yyyy
格式(例如 Apr 2012
) 它们都会正确解析。我知道,这是一个大胆的假设。
您还必须将值格式化回最终结果的String
表示形式。
var monthlist1 = data.
Select(x => new { wkdate = x.WKENDDATE }).
OrderBy(x=> CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(x.Month)).
ThenBy(x=> x.Year).
Select(m => new {
monthname = m.wkdate.ToString("MMM yyyy",
CultureInfo.CreateSpecificCulture("en-US"))
}).
Distinct().
ToList();
像
var monthlist1 = data.Select(m => new DateTime(m.WKENDDATE.Year,
m.WKENDDATE.Month,
1);
var monthlist2a =
data.Select(x =>
new { wkdate = ExportHelper.getSplitEndDate(x.WKENDDATE).AddDay(1)})
.Where(l =>
ExportHelper.isSplitWeek(l.wkdate.AddDays(-6), l.wkdate) == true);
var monthlist2b = monthlist2a.Select(m => new DateTime(m.WKENDDATE.Year,
m.WKENDDATE.Month,
1);
var monthlist = monthlist1.Union(monthlist2b).Distinct()
.OrderBy(m => (m.Year * 100) + m.Month)
.Select(m =>
m.ToString("MMM yyyy", CultureInfo.CreateSpecificCulture("en-US"));
这样就可以避免不必要的格式化和解析