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

如何对包含Timestamp类型元素的数组进行排序?

解决Timestamp列表排序的void错误问题

错误原因

List.sort()是原地排序方法,返回值为void——它只会直接修改原列表,不会返回新的排序后列表。你报错的核心原因是把它当成了返回新列表的方法,写了类似var sorted = myarr.sort();的代码,试图将void类型赋值给变量,触发了类型错误。

正确排序方式

根据需求选择以下两种方案:

1. 原地修改原列表(无需保留原数据)

直接调用sort()方法,不要将它的返回值赋值给任何变量:

// 以Firebase Timestamp为例(该类已实现Comparable接口)
List<Timestamp> myarr = [
  Timestamp(seconds: 1620000000, nanoseconds: 0),
  Timestamp(seconds: 1610000000, nanoseconds: 500000000),
];
myarr.sort(); // 直接执行,原列表会被排序
// 此时myarr即为排序后的结果

如果是自定义的Timestamp类(未实现Comparable接口),需要传入自定义比较器:

myarr.sort((a, b) {
  // 先比较秒数,秒数相同再比较纳秒
  int secCompare = a.seconds.compareTo(b.seconds);
  if (secCompare != 0) return secCompare;
  return a.nanoseconds.compareTo(b.nanoseconds);
});

2. 生成新的排序后列表(保留原列表)

若需要保留原列表的原始状态,使用Dart 3.0及以上版本提供的List.sorted()方法,它会返回一个新的排序后的列表:

List<Timestamp> myarr = [/* 原始数据 */];
List<Timestamp> sortedArr = myarr.sorted(); // 原列表不变,sortedArr是排序后的新列表

自定义Timestamp类同样可以传入比较器:

List<Timestamp> sortedArr = myarr.sorted((a, b) {
  int secCompare = a.seconds.compareTo(b.seconds);
  if (secCompare != 0) return secCompare;
  return a.nanoseconds.compareTo(b.nanoseconds);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:55:19