如何选择每周最晚的日期时间?c#



我必须实现一个算法,它接收一个DateTime列表,并恢复每周最新的DateTime。

的例子:

29/06/2016 -> Lastest date of the last week of the month
27/06/2016
24/06/2016 -> Lastest date of the before last week of the month
22/06/2016
21/06/2016
15/06/2016 -> Lastest of the third week
13/06/2016
...

预期的结果

29/06/2016
24/06/2016
15/06/2016

我没有问代码是谁做的,而是一些解决这个问题的指示或指示。

注意:这个答案假设你对"自然"周感兴趣,而不是真正关心年份。例如,2015年12月31日是星期四,2016年1月1日是星期五——在我看来(并在这个答案中使用算法),这些将被算作在同一个星期……毕竟,这两天之前/之后的星期一是一样的。

最简单的解决方案可能是按"开始时间"分组,然后取每组中最新的值。查找一周的开始有点尴尬,最好使用helper方法:

var latestPerWeek = dates.GroupBy(StartOfWeek)
                         .Select(g => g.Max())
                         .ToList();
...
private static DateTime StartOfWeek(DateTime date)
{
    date = date.Date; // Just remove any time parts...
    // 0=Sunday, 1=Monday... 6=Saturday
    int sundayToSaturdayDayOfWeek = (int) date.DayOfWeek;
    // 0=Monday, 1=Tuesday... 6=Sunday
    int mondayToSundayDayOfWeek = ((sundayToSaturdayDayOfWeek - 1) + 7) % 7;
    return date.AddDays(-mondayToSundayDayOfWeek);
}

注意,. net的"一年中的星期"处理很容易使用,但基本上不能处理这种情况。在Noda Time 2.0中,这将简单得多,但目前还没有…

这只适用于同一年的日期

我将使用CultureInfo.InvariantCulture.Calendar.GetWeekOfYear来确定周数。然后你可以用GroupBy来表示这个数,并对每一组进行降序排序。现在你只需要选择每周/组的First()项目

  List<DateTime> dtList = new List<DateTime>();
  dtList.Add(new DateTime( 2016, 6,29));
  dtList.Add(new DateTime( 2016,6, 27));
  dtList.Add(new DateTime( 2016,6 ,24));
  dtList.Add(new DateTime( 2016,6,22 ));
  dtList.Add(new DateTime( 2016,6,21 ));
  dtList.Add(new DateTime( 2016,6, 15 ));
  dtList.Add(new DateTime( 2016, 6,13));
  List<DateTime> dtResult = dtList
      .GroupBy(x => CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(x, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday))
      .Select(x => x.OrderByDescending(y => y).First())
      .ToList();

相关内容

  • 没有找到相关文章

最新更新