我必须实现一个算法,该算法接收DateTime列表并恢复每周的最新DateTime。
示例:
(click)
预期结果
ViewContainerRef.createComponent()
我不会问代码谁做了那个,但有些方向或指示可以解决这个问题。
答案 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将包含您正在寻找的内容:)