以两个或多个为一组迭代列表

我喜欢遍历列表,并将其分成几对:

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循环等来完成此操作,但是我想知道是否有一种更优雅的方法。

yuanyuanlizhu 回答:以两个或多个为一组迭代列表

没有内置的东西。我今天写这个的方式是:

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

简单且不安全的方法(它需要符合输入数据数组的大小)。

import 'package:enumerable/enumerable.dart';
import 'package:lists/lists.dart';
import 'package:tuple/tuple.dart';

void main(List<String> args) {
  final list = [1,8];

  final q2 = StepList(0,list.length - 1,2)
      .select((e) => Tuple2.fromList(list.sublist(e,e + 2)));
  print(q2);

  final q4 = StepList(0,4)
      .select((e) => Tuple4.fromList(list.sublist(e,e + 4)));
  print(q4);
}

结果:

([1,2],[3,4],[5,6],[7,8])
([1,8])

另一种方式:

import 'package:enumerable/enumerable.dart';
import 'package:lists/lists.dart';

void main(List<String> args) {
  final list = [1,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;
}
本文链接:https://www.f2er.com/3141447.html

大家都在问