我有一个带有属性FlyerDate
作为日期时间的传单集合,我想创建一个包含月份和年份的下拉列表,例如" nov 2015,2015年12月,2016年1月和#34; ..
这是我的代码:
var monthList = flyers.Where(i => i.FlyerDate != DateTime.MinValue && i.FlyerDate.Year >= 2013)
.GroupBy(i => i.FlyerDate.Month)
.Select(g => new {
Month = g.Key,
Year = g.First(i => i.FlyerDate != DateTime.MinValue).FlyerDate.Year,
FullDate = String.Concat(DateTimeFormatInfo.CurrentInfo.GetMonthName(g.Key), " ", g.First(i => i.FlyerDate != DateTime.MinValue).FlyerDate.Year),
Total = g.Count(i => i.FlyerID > 0)
}
);
我希望GroupBy
同时适用于月份和年份,因为在我的情况下,列表仅包含每个月的第一次出现。任何提示?
答案 0 :(得分:5)
您需要按包含年份和月份的匿名类型进行分组:
var monthList = flyers.Where(i => i.FlyerDate.Year >= 2013)
.GroupBy(i => new { i.FlyerDate.Year, i.FlyerDate.Month })
.Select(g => new {
Year = g.Key.Year,
Month = g.Key.Month,
FullDate = DateTimeFormatInfo.CurrentInfo.GetMonthName(g.Key.Month) + " " + g.Key.Year
});
顺便说一句,如果您希望将缩写的月份名称作为所需结果,则建议您使用DateTimeFormatInfo.CurrentInfo.GetAbbreviatedMonthName
代替GetMonthName
。
答案 1 :(得分:0)
我怀疑您的问题可能是GroupBy(i => i.FlyerDate.Month)
条款。这种分组似乎不尊重年份,所以当你进入Select
时,你只剩下12个小组。
将年份纳入GroupBy
lambda可以为每个月创建一个唯一的组。假设您的Month
和Year
为int
s:
.GroupBy(i => (i.FlyerDate.Year * 12) + i.FlyerDate.Month)
可能是一个很好的起点。
答案 2 :(得分:0)
var query = flyers.GroupBy(f => f.FlyerDate.ToString("MMM yyyy"))
foreach (var group in query)
{
Console.WriteLine(group.Key);
foreach (Flyer f in group)
Console.WriteLine(f.FlyerDate);
}