如何按周分组日期?

我正在为我正在创建的定制应用程序编写Excel导出程序,我对C#中的LINQ分组有疑问。

基本上,这个新的Excel导出器类有两个日期。 然后,该class级检索此日期范围之间的所有托运。

作为此出口商的一部分,我需要能够将日期分组为几周,并获取该周的值。 因此,例如,如果我给了07/12/2011和2011年12月22日(dd / MM / yyyy格式),我需要将它们之间的所有货物分组为几周(每周从星期日开始)。 使用上述日期的理想结果将是

Week 1: (consignments between 04/12/2011 and 10/12/2011) Week 2: (consignments between 11/12/2011 and 17/12/2011) Week 3: (consignments between 18/11/2011 and 24/12/2011) 

有任何想法吗?

这里的基本问题是如何将DateTime实例投影到一年中的一周值。 这可以通过调用Calendar.GetWeekOfYear来完成。 所以定义投影:

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

您可以通过调整方法调用中的参数来准确配置“周数”的确定方式。 如果您愿意,您还可以决定将投影定义为例如扩展方法; 这并没有改变代码的本质。 无论如何,您可以按周分组:

 var consignmentsByWeek = from con in consignments group con by weekProjector(con.Date); 

如果您还想将输出约束到两个特定日期之间的货物,只需添加适当的where子句; 分组逻辑不会改变。

犹豫不决,虽然我不同意作为一个受人尊敬的回答者,我认为这里接受的答案是错误的,这并不是一个基本上是投射到一周的价值的问题。

GetWeekOfYear()和一般概念是根据一些商定的标准将指数值分配给一年内的几周。 由于我认为提问者需要,因此不适合将日期分为七个相邻日子。

在多年结束时,不仅会将GetWeekOfYear()作为建议结果用于少于七天的小组,更糟糕的是,GetWeekOfYear()支持的各种标准通常会将一年的前几天分配到最后一天上一周的一周,但GetWeekOfYear()结果只包含整数周索引,没有引用相关年份,按new { Year = date.Year, weekProjector(date) }date.Year + "-" + weekProjector(date)提问者一年中的date.Year + "-" + weekProjector(date)将于2011年1月1日在圣诞节到新年除夕的12个月后分组。

因此,我认为最初的问题基本上不是预测一周的价值,而是预测一周的所有时间价值,“你可能会说,周开始y / m / d”,所以分组只需要通过一周的第一天,即(假设您很乐意默认为星期日),只需:

 group by date.AddDays(-(int)date.DayOfWeek) 

除了Jon's答案,您还可以获得该周第一天的日期,然后按该日期分组。

获取本周第一天的日期。 你可以使用这段代码:

 public static class DateTimeExtensions { public static DateTime StartOfWeek(this DateTime dt, DayOfWeek startOfWeek) { int diff = dt.DayOfWeek - startOfWeek; if (diff < 0) { diff += 7; } return dt.AddDays(-1 * diff).Date; } } 

然后你可以按照这样的第一个星期分组:

 var consignmentsByWeek = from con in consignments group con by con.Datedate.StartOfWeek(DayOfWeek.Monday);