多年间按周分组日期

5
我有一个DateTime值的列表,我想将整个列表拆分为每周的子列表。
日期可能跨越多年(用户选择开始和结束日期),因此按日历周数拆分它们的解决方案会导致冲突。
有没有一种方法可以遍历列表,然后将每周的DateTime值存储在新的二维列表中?
可用的值是从星期一到星期五,第一周和最后一周可能具有较少的值。
我找到的唯一相关问题是如何按周分组日期,但它不适用于我的情况。

类似于这样,但不是按年份和周数分组:https://dev59.com/iHRC5IYBdhLWcg3wP-j4 - mikelegg
如果你将年份乘以100,再加上周数,就会得到一个独特的分组。然后你需要处理跨越两个年份的情况。因此,你需要测试第一周是否从星期天开始,如果是,则包括在当前年份中,否则,将年份减1并加53。 - jdweng
只返回翻译文本:虽然这样做可以隐藏一些含义,但也可以工作。 - mikelegg
1个回答

5
你可以使用这个方法来获取给定DateTime的周数。然后,你可以使用一个包含年份和周数的匿名类型来使用Enumerable.GroupBy
var yearWeekGroups = allDates.GroupBy(d => new { d.Year, WeekNum = GetIso8601WeekOfYear(d) });

如果您想要一个List<List<DateTime>>,其中每个子列表包含一周的日期:

List<List<DateTime>> allWeeks = yearWeekGroups.Select(g => g.ToList()).ToList();

如果您所在的国家不使用ISO 8601标准,您可以使用Calendar.GetWeekOfYear函数:

var cc = CultureInfo.CurrentCulture;
var yearWeekGroups = allDates.GroupBy(d => new 
{ 
    d.Year, 
    WeekNum = currentCulture.Calendar.GetWeekOfYear(d, cc.DateTimeFormat.CalendarWeekRule, cc.DateTimeFormat.FirstDayOfWeek) 
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接