You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:17:49