在 Dart 中更改列表大小的最佳方法是什么?

Mar*_*rcG 3 list dart

  • 我有一个oldLength物品清单。
  • 我希望它有newLength物品。
  • 如果newLength < oldLength,我只想削减额外的项目。
  • 如果newLength > oldLength,我想用空值填充它。

我是这样写的:

List<T> cutList<T>(List<T> oldList, int newLength) {
    return new List.generate(newLength, (index) {
      if (index < oldList.length) return oldList[index];
      else return null;
   });
}
Run Code Online (Sandbox Code Playgroud)

就简单性而言,有没有更好的方法?而在效率方面呢?

lrn*_*lrn 5

如果它是一个可增长的列表并且你不介意改变它:

List<T?> cutList<T>(List<T?> oldList, int newLength) {
  oldList.length = newLength;
  return oldList;
}
Run Code Online (Sandbox Code Playgroud)

请注意,在 Dart 引入 Null Safety 之后,您只能在其元素类型可为空的情况下增长这样的列表(否则它无法分配null给新的元素位置)。既然你要求随着null价值观成长,那就应该如此。的声明cutListhere确保列表类型可以为空。

如果你想创建一个新列表,那么你仍然需要知道它T是可空的(否则你不能创建一个更大的列表):

List<T?> cutList<T>(List<T?> oldList, int newLength) {
  return List<T?>.filled(newLength, null)
    ..setRange(0, min(newLength, oldList.length), oldList);
}
Run Code Online (Sandbox Code Playgroud)

min从哪里进口dart:math)。

对于更现代的 Dart 方法,我可能会选择:

List<T?> cutList<T>(List<T?> oldList, int newLength) {
    return <T?>[...oldList.take(newLength), 
                for (var i = oldList.length; i < newLength; i++) null];
Run Code Online (Sandbox Code Playgroud)

有很多方法。任何只复制每个元素一次的东西都是好的。