我喜欢遍历列表,并将其分成几对:
List<String> list = [1,2,3,4,5,6,7,8];
List<Tuple2> listOfTuples = list.take2((value1,value2) => Tuple2(value1,value2));
print(listOfTuples.toString()); // output => [[1,2],[3,4],[5,6],[7,8]]
我知道飞镖中有take(count)
,但我找不到很好的例子。
我知道我可以使用for
循环等来完成此操作,但是我想知道是否有一种更优雅的方法。
答案 0 :(得分:4)
没有内置的东西。我今天写这个的方式是:
var list = [1, 2, 3, 4, 5, 6, 7, 8];
var tuples = [
for (int i = 0; i < list.length - 1; i += 2) Tuple2(list[i], list[i + 1]),
];
您可以编写一个扩展名,该扩展名在take2
上提供一个API List
,可以按照您的描述方式使用。
extension Take2<T> on List<T> {
List<R> take2<R>(R Function(T, T) transform) => [
for (int i = 0; i < this.length - 1; i += 2)
transform(this[i], this[i + 1]),
];
}
答案 1 :(得分:1)
简单且不安全的方法(它需要符合输入数据数组的大小)。
import 'package:enumerable/enumerable.dart';
import 'package:lists/lists.dart';
import 'package:tuple/tuple.dart';
void main(List<String> args) {
final list = [1, 2, 3, 4, 5, 6, 7, 8];
final q2 = StepList(0, list.length - 1, 2)
.select((e) => Tuple2.fromList(list.sublist(e, e + 2)));
print(q2);
final q4 = StepList(0, list.length - 1, 4)
.select((e) => Tuple4.fromList(list.sublist(e, e + 4)));
print(q4);
}
结果:
([1, 2], [3, 4], [5, 6], [7, 8]) ([1, 2, 3, 4], [5, 6, 7, 8])
另一种方式:
import 'package:enumerable/enumerable.dart';
import 'package:lists/lists.dart';
void main(List<String> args) {
final list = [1, 2, 3, 4, 5, 6, 7, 8];
print(group(list, 2));
print(group(list, 4));
print(group(list, 8));
}
Iterable<List<E>> group<E>(List<E> input, int size) {
if (input.isEmpty) {
return List<List<E>>();
}
if (input.length % size != 0) {
throw ArgumentError('Bad size: $size');
}
final query = StepList(0, input.length - 1, size)
.select((e) => input.sublist(e, e + size));
return query;
}