如何选择每周的最新日期时间? C#

时间:2016-07-01 08:04:09

标签: c# algorithm datetime

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

示例:

(click)

预期结果

ViewContainerRef.createComponent()

我不会问代码谁做了那个,但有些方向或指示可以解决这个问题。

3 个答案:

答案 0 :(得分:4)

注意:这个答案假设您对“自然”周感兴趣,这些周并不关心这一年。例如,2015年12月31日是星期四,2016年1月1日是星期五 - 在我看来(并使用此答案中的算法)那些将被视为在同一周......两天之前的星期一是毕竟是一样的。

对此最简单的解决方案可能是按“周开始”进行分组,然后在每个组中获取最新值。找到一周的开始有点尴尬,最好用辅助方法完成:

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中,这将更简单,但现在还没有......

答案 1 :(得分:3)

这仅适用于同年的日期

我会使用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();

答案 2 :(得分:-1)

这有效:

DateTime[] dd = 
{
    Convert.ToDateTime("2016/06/29"),
    Convert.ToDateTime("2016/06/27"),
    Convert.ToDateTime("2016/06/24"),
    Convert.ToDateTime("2016/06/22"),
    Convert.ToDateTime("2016/06/21")
};

Func<DateTime, int> weekProjector =
    d => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(
         d,
         CalendarWeekRule.FirstFourDayWeek,
         DayOfWeek.Sunday);

var LatestByWeek = dd.GroupBy(g => weekProjector(g)).OrderBy(o => o.Max()).Select(s => s.First());

LastestByWeek将包含您正在寻找的内容:)