如何在Dart中并行访问两个列表?

jxm*_*s12 2 dart

我已经确认了两个长度相同的清单。我想同时操作它们。我的代码当前看起来像这样:

var a = [1, 2, 3];
var b = [4, 5, 6];
var c = [];
for(int i = 0; i < a.length; i++) {
  c.add(new Foo(a, b));
}
Run Code Online (Sandbox Code Playgroud)

以这种方式计算列表A的长度似乎有些笨拙。有没有更好,更Dart-y的方式来完成此任务?

Csa*_*oth 22

Dart 团队提供了一个集合包,其中包含一个IterableZip类:

import 'package:collection/collection.dart';

final a = [1, 2, 3];
final b = [4, 5, 6];
List<Foo> c = [];
for (final pairs in IterableZip([a, b])) {
  c.add(Foo(pairs[0], pairs[1]));
}
Run Code Online (Sandbox Code Playgroud)

更多注意事项:

  • package:collection/iterable_zip.dart已弃用,您只需要collection.dart像所示的那样导入。
  • final a并且final b变量将具有推断的模板列表类型。我没有指定 的模板类型IterableZip,但在某些情况下(在我使用它的复杂情况下)您可能需要像 那样显式键入它IterableZip<int>,因此在循环中您可以更方便地访问成员。在这个简单的情况下,编译器/解释器可以轻松推断类型。
  • 该软件包不是核心 Dart 的一部分,但它不需要 Flutter:如果是 Dart 项目,您可以通过dart pub add collection安装它


Chr*_*uck 7

现在我们已经有了 dart 中的列表推导式:

final c = [for(int i = 0; i<a.length; i+= 1) Foo(a[i], b[i])];
Run Code Online (Sandbox Code Playgroud)


Har*_*sen 6

看一下quiver包的zip功能

您可以这样写:

var a = [1, 2, 3];
var b = [4, 5, 6];
var c = [];
for (var pair in zip([a, b])) {
  c.add(new Foo(pair[0], pair[1]));
}
Run Code Online (Sandbox Code Playgroud)


Sno*_*now 6

var c = List.generate(a.length, (i) => Foo(a[i], b[i]));
Run Code Online (Sandbox Code Playgroud)