【问题标题】:linq c# grouping by month and year rangelinq c#按月份和年份范围分组
【发布时间】:2017-06-12 12:42:25
【问题描述】:

我有一个带有日期的记录列表。我想按月和年对这个列表进行分组,例如,我可以将日期范围从 2012 年 10 月到 2013 年 3 月,然后从 2013 年 4 月到 2013 年 9 月,然后从 2013 年 10 月到 2014 年 3 月,最后从 2014 年 4 月到 2014 年 9 月

所以我希望将数据分成 4 组,每组跨越 6 个月的时间段 所以 2012 年 10 月 - 2013 年 3 月 2013 年 4 月 - 2013 年 9 月 2013 年 10 月 - 2014 年 3 月 2014 年 4 月 - 2014 年 9 月

我想出了如何按月份范围分组,但我不知道如何包括年份(我目前有 2 个组),这是我到目前为止所拥有的

var season = List.GroupBy(item => ((item.StartDate.Month - 1) / 6));

【问题讨论】:

  • 解决一个更简单的问题。如果范围是 1 月到 6 月和 7 月到 12 月,您能看看如何正确分组吗?
  • 您可能可以按自最小日期起经过多少个月进行分组。即您可以通过var minDate = List.Min(l => l.StartDate) 设置最小日期,然后通过var season = List.GroupBy(item => (item.StartDate - minDate).TotalMonths/6) 分组......类似的东西

标签: c# linq date group-by


【解决方案1】:

计算总月数是要走的路

.GroupBy(item => (item.StartDate.Year * 12 + item.StartDate.Month + 2) / 6))

【讨论】:

    【解决方案2】:

    您可以先按年分组,然后再按月分组

    var season = List.GroupBy(item => new { item.StartDate.Year,  month = ((item.StartDate.Month - 1) / 6)});
    

    或者您可以为您的值使用组合标签,例如

    var season = List.GroupBy(item => item.StartDate.Year.ToString() + ((item.StartDate.Month - 1) / 6).ToString());
    

    【讨论】:

    • 你的第一个选项给了我一个错误'invalid anonymous type member declarator'
    • 现在应该已经修复了,如果是计算出来的,你需要命名你的匿名属性。在第一个属性中,您不必这样做,因为名称将取自属性名称“年份”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    相关资源
    最近更新 更多