You need to enable JavaScript to run this app. Dart中如何按DateTime属性年份将List<DayTasks>拆分为子列表?
优惠活动
大模型
产品
解决方案
定价
更多

Dart中如何按DateTime属性年份将List<DayTasks>拆分为子列表?

按年份拆分 List<DayTasks> 的实现逻辑

整体思路是通过年份值对原列表元素做映射分组,每个分组就是独立的同年份子列表,无需重复判断元素归属。

前置注意事项

由于DayTasks中的_date是私有字段,仅和DayTasks定义在同一Dart库/文件下的代码可直接访问该字段;如果需要跨文件调用分组逻辑,需要在DayTasks类中补充公共的年份访问方法,避免私有属性访问报错:

class DayTasks{
  List<Task> _tasks = [];
  final DateTime _date;

  // 新增公共getter,仅暴露年份值,不破坏原有类的封装性
  int get year => _date.year;
}

具体实现

原生无第三方依赖实现

不需要引入额外包,通过遍历列表做分组即可:

// 待拆分的原列表
List<DayTasks> originalList = [];

// 存储分组结果:key为年份值,value为对应年份的任务列表
final Map<int, List<DayTasks>> yearGroups = {};

for (final dayTask in originalList) {
  // 提取当前任务对应的年份
  final taskYear = dayTask._date.year;
  // 初始化对应年份的空列表(如果尚未存在)
  yearGroups.putIfAbsent(taskYear, () => <DayTasks>[]);
  // 将当前任务加入对应年份的分组
  yearGroups[taskYear]!.add(dayTask);
}

// 转换为要求的子列表集合(无年份key的纯列表结构)
final List<List<DayTasks>> splitResult = yearGroups.values.toList();

简化写法(使用官方collection工具包)

如果项目已经引入了package:collection,可以用内置的groupBy函数简化分组代码:

// 导入工具包
import 'package:collection/collection.dart';

final Map<int, List<DayTasks>> yearGroups = groupBy(
  originalList,
  // 分组的key为任务对应的年份
  (dayTask) => dayTask._date.year,
);

final List<List<DayTasks>> splitResult = yearGroups.values.toList();

常用调整

  • 时区偏差修正:默认DateTime.year取的是本地时区的年份,如果需要按UTC时间的年份做拆分,把年份取值替换为dayTask._date.toUtc().year即可
  • 排序调整:默认分组顺序是按照列表中第一次出现对应年份的顺序排列,如果需要按年份从小到大排列子列表,可以在输出前对分组key做排序处理:
// 按年份升序输出拆分结果
final sortedSplitResult = (yearGroups.keys.toList()..sort())
  .map((year) => yearGroups[year]!)
  .toList();

内容的提问来源于stack exchange,提问作者Satyam Pandey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 10:06:03