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)
就简单性而言,有没有更好的方法?而在效率方面呢?
如果它是一个可增长的列表并且你不介意改变它:
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)
有很多方法。任何只复制每个元素一次的东西都是好的。