C#LINQ创建月份和年份列表

时间:2016-10-13 08:58:37

标签: c# .net linq

我有一个带有属性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同时适用于月份和年份,因为在我的情况下,列表仅包含每个月的第一次出现。任何提示?

3 个答案:

答案 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可以为每个月创建一个唯一的组。假设您的MonthYearint 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);
}