【问题标题】:How can I iterate through two lists in parallel in Dart?如何在 Dart 中并行遍历两个列表?
【发布时间】:2017-07-20 19:04:19
【问题描述】:

我有两个已确认长度相同的列表。我想同时对它们进行操作。我的代码目前看起来像这样:

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

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

【问题讨论】:

    标签: dart


    【解决方案1】:

    查看quiver 包的zip function

    你可以这样写:

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

    【讨论】:

    • 链接已损坏,虽然在查找后解决了我的问题,但答案很好。
    • 链接又好了:-)
    【解决方案2】:

    现在我们在 dart 中有了列表推导:

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

    【讨论】:

      【解决方案3】:

      不需要外部包,collection包中有一个内置类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]));
      }
      

      还有一些注意事项:

      • package:collection/iterable_zip.dart 已弃用,您只需导入 collection.dart,如图所示。
      • final afinal b 变量将具有推断的模板列表类型。我没有为IterableZip 指定模板类型,但在某些情况下(在我使用它的复杂情况下)您可能需要像IterableZip&lt;int&gt; 一样显式键入它,因此在循环中您可以更方便地访问成员。在这种简单的情况下,编译器/解释器可以轻松推断类型。

      【讨论】:

        【解决方案4】:

        如果您想要使用quiver 包的zip 函数的更短的解决方案,您可以执行以下操作:

        final c = zip([a, b]).map((item) => Foo(item[0], item[1])).toList();
        

        【讨论】:

          猜你喜欢
          • 2010-12-12
          相关资源
          最近更新 更多