我正在为我正在创建的定制应用程序编写Excel导出器,我对C#中的LINQ分组有疑问.
基本上,这个新的Excel导出器类有两个日期.然后,该班级检索此日期范围之间的所有托运.
作为此导出器的一部分,我需要能够将日期分组为几周,并获取该周的值.因此,例如,如果我给了07/12/2011和22/12/2011(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)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
Jon*_*Jon 34
这里的基本问题是如何将DateTime实例投影到一周的价值.这可以通过调用来完成Calendar.GetWeekOfYear.所以定义投影:
Func<DateTime, int> weekProjector =
d => CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(
d,
CalendarWeekRule.FirstFourDayWeek,
DayOfWeek.Sunday);
Run Code Online (Sandbox Code Playgroud)
您可以通过调整方法调用中的参数来准确配置"周数"的确定方式.如果您愿意,您还可以决定将投影定义为例如扩展方法; 这并没有改变代码的本质.无论如何,您可以按周分组:
var consignmentsByWeek = from con in consignments
group con by weekProjector(con.Date);
Run Code Online (Sandbox Code Playgroud)
如果您还想将输出约束到两个特定日期之间的货物,只需添加适当的where条款; 分组逻辑不会改变.
sto*_*roz 26
犹豫不决,虽然我不同意作为一个受尊敬的回答者,我认为这里接受的答案是错误的,这并不是一个基本上是投射到一周的价值的问题.
GetWeekOfYear()和一般概念是根据一些商定的标准将指数值分配给一年内的几周.由于我认为提问者需要,因此不适合将日期分为七个相邻日期的小组.
在多年结束时,不仅会将GetWeekOfYear()作为建议结果用于少于七天的小组,更糟糕的是,GetWeekOfYear()支持的各种标准通常会将一年的前几天分配到最后一天上一周的一周,但GetWeekOfYear()结果仅包含整数周索引而没有参考相关年份,在提问者的年份new { Year = date.Year, weekProjector(date) }或date.Year + "-" + weekProjector(date)在提问者的年份中分组将在2011年1月1日分组,在圣诞节到新年前夕十二个月那年晚些时候.
因此,我认为最初的问题基本上不是预测一周的价值,而是预测一周的所有时间值,"你可能会说,周开始y/m/d",所以分组只需要通过一周的第一天,即(假设您很高兴默认为星期日),只需:
group by date.AddDays(-(int)date.DayOfWeek)
Run Code Online (Sandbox Code Playgroud)
小智 8
除了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;
}
}
Run Code Online (Sandbox Code Playgroud)
那么你可以按一周的第一个日期进行分组,如下所示:
var consignmentsByWeek = from con in consignments
group con by con.Datedate.StartOfWeek(DayOfWeek.Monday);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11278 次 |
| 最近记录: |