如何使用LINQ或函数式方法按周六起始的自定义周拆分日期列表?
按自定义周六起始周分组的LINQ实现
要实现你需要的分组,核心思路是给每个日期计算其所属自定义周的起始标识(周六),然后按这个标识分组。下面是具体的代码实现和步骤解析:
步骤1:准备并转换日期数据
首先把你的字符串日期列表转换成DateTime对象,确保年份是2018年(因为原字符串只有月日):
using System; using System.Collections.Generic; using System.Globalization; using System.Linq; var dateStrings = new List<string> { "Mar 2", "Mar 6", "Mar 7", "Mar 26" }; // 转换为2018年的DateTime对象,避免系统文化影响,使用InvariantCulture var dates = dateStrings.Select(s => DateTime.Parse($"2018 {s}", CultureInfo.InvariantCulture));
步骤2:定义自定义周起始的计算逻辑
我们需要一个函数来计算任意日期对应的自定义周起始(即该日期所在周的周六):
DateTime GetCustomWeekStart(DateTime date) { // DayOfWeek枚举中,Saturday=6,Sunday=0,以此类推 // 计算当前日期距离最近的上周六的天数 int daysSinceLastSaturday = (date.DayOfWeek - DayOfWeek.Saturday + 7) % 7; // 减去这个天数,得到当前日期所属周的起始周六 return date.AddDays(-daysSinceLastSaturday); }
步骤3:使用LINQ分组并格式化结果
通过GroupBy按自定义周起始分组,再对每组内的日期排序、转回字符串格式:
var groupedDates = dates .GroupBy(GetCustomWeekStart) // 可选:对每组内的日期按时间排序,保证顺序正确 .Select(group => group.OrderBy(dt => dt) .Select(dt => dt.ToString("MMM d", CultureInfo.InvariantCulture)) .ToList()) .ToList();
结果验证
运行这段代码后,groupedDates的结果就是你期望的:
- 第一组:
["Mar 2"](属于2018年2月24日周六开始的周) - 第二组:
["Mar 6", "Mar 7"](属于2018年3月3日周六开始的周) - 第三组:
["Mar 26"](属于2018年3月24日周六开始的周)
关键逻辑说明
- 计算
daysSinceLastSaturday时,加7再取模是为了处理负数情况(比如周五的DayOfWeek=5,5-6=-1,加7后是6,取模7还是6,对应减去6天得到上周六)。 - 用
GroupBy的键来标识同一周的日期,确保所有属于同一自定义周的日期被分到一组。
内容的提问来源于stack exchange,提问作者firefly
相关产品推荐
相关产品推荐

