首页 文章

如何从按周,月,季度或年份分组的随机日期列表中提取最大日期?

提问于
浏览
2

给定一个随机日期列表,是否有一个优雅的C#方式(LINQ或其他)来提取列表中的最后一个日期,按周,月,季度或年份分组?

我希望这是明确的,但如果没有,使用这个示例日期集:

  • 星期一01/01/2018

  • 星期二02/01/2018

  • 星期四04/01/2018

  • 星期二09/01/2018

  • 星期四11/01/2018

  • 星期五12/01/2018

  • 星期一22/01/2018

  • 星期二23/01/2018

  • Wed 24/01/2018

  • Wed 31/01/2018

  • 星期四01/02/2018

  • 星期二27/02/2018

按周提取最大值将产生

  • 星期四04/01/2018 =样本第一周的最后一个日期

  • 星期五12/01/2018 =样本第二周的最后一个日期

  • Wed 24/01/2018 =等

  • 星期四01/02/2018

  • 星期二27/02/2018

并且按月提取最大值会产生

  • Wed 31/01/2018 =样本中1月份的最后一个日期

  • 星期二27/02/2018 =样本中二月份的最后一个日期

我需要能够按周数,日历月,日历季和日历年进行提取 .

我甚至不确定如何开始这个 . 所以目前我没有代码可以分享 .

任何想法都将非常受欢迎 .

CLARIFICATION: 为了我们人类的利益,这里包含了工作日的名字 . 我的实际日期是合适的 DateTime 类型 . 因此代码不需要将字符串解析为DateTimes .

另外,我可以在没有LINQ的情况下轻松编写类似的内容 . 但我所希望的是使用LINQ或其他一些聪明技巧的优雅解决方案 .

2 回答

  • 1

    使用LINQ这非常简单 . 这里是按 month 进行分组的示例:

    var grouped = dates.OrderBy(x => x.Ticks).GroupBy(x => x.Month)
                       .Select(x => new {Month = x.Key, Max = x.Max()});
    

    这给出了你的例子:

    {Month = 1,Max = 1/31/2018 12:00:00 AM} {Month = 2,Max = 2/27/2018 12:00:00 AM}


    要为 week 执行此操作,请将此lambda用于 GroupBy

    x => CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(
             x, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday
         )
    

    输出:

    {Week = 1,Max = 1/4/2018 12:00:00 AM} {Week = 2,Max = 1/12/2018 12:00:00 AM} {Week = 4,Max = 1/24 / 2018 12:00:00 AM} {Week = 5,Max = 2/1/2018 12:00:00 AM} {Week = 9,Max = 2/27/2018 12:00:00 AM}


    对于 quarter

    x => (x.Month + 2)/3
    

    输出:

    {Quarter = 1,Max = 2/27/2018 12:00:00 AM}


    对于 year

    x => x.Year
    

    产量

    {Year = 2018,Max = 2/27/2018 12:00:00 AM}

  • 0

    我在C#中确定了这一点,可以适应任何其他所需的分组

    public static Dictionary<Tuple<int, int>, DateTime> MaxByYearMonth(this List<DateTime> sourceDateTimes)
        {
            IEnumerable<DateTime>                             ordered = sourceDateTimes.OrderBy(x => x.Ticks);
            IEnumerable<IGrouping<Tuple<int, int>, DateTime>> grouped = ordered.GroupBy(x => new Tuple<int, int>(x.Year, x.Month));
            Dictionary<Tuple<int, int>, DateTime>             maxed   = grouped.ToDictionary(x => x.Key, x => x.Max());
            return maxed;
        }
    

相关问题