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

3
  • 我有一个包含oldLength项的列表。
  • 我希望它能有newLength项。
  • 如果newLength < oldLength,我只想删掉多余的项。
  • 如果newLength > oldLength,我想用null来填充它。

我的代码如下:

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;
   });
}

有没有更简单的方法?在效率方面呢?

2个回答

5
如果这是一个可扩展的列表,并且您不介意改变它:
List<T?> cutList<T>(List<T?> oldList, int newLength) {
  oldList.length = newLength;
  return oldList;
}

请注意,Dart 引入了 Null Safety 后,只能像这样 增加 可为空类型元素的列表 (因为否则它将无法将 null 分配给新的元素位置)。由于您要求使用 null 值进行添加,所以应该是这种情况。此处声明的 cutList 确保列表类型可为空。
如果您想创建一个新的列表,则仍然需要知道 T 是可为空的(否则不能创建更大的列表):
List<T?> cutList<T>(List<T?> oldList, int newLength) {
  return List<T?>.filled(newLength, null)
    ..setRange(0, min(newLength, oldList.length), oldList);
}

(其中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];

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


0

与上面相同,但这是一个扩展,因此您可以随时在任何列表上使用它

不使用数学库

extension CutList<T> on List<T?> {
  List<T?> cutList(List<T?> oldList, int newLength) {
    return <T?>[
      ...oldList.take(newLength),
      for (var i = oldList.length; i < newLength; i++) null
    ];
  }
}

数学相关

import 'dart:math';

extension CutList<T> on List<T?> {
  List<T?> cutList(List<T?> oldList, int newLength) {
    return List<T?>.filled(newLength, null)
      ..setRange(0, min(newLength, oldList.length), oldList);
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接