有没有一种方法可以在Dart中获得类似于Swift的List.enumerated()方法的功能?

时间:2020-06-18 14:00:22

标签: dart

在Swift中,如果有列表,您可以像这样迭代它

for (index, val) in itemList {
    //do stuff
}

我正在尝试在Dart中重新创建相同的功能,但这是我想出的最好的-

extension ListExtensions<T> on List<T> {
  List<List<dynamic>> enumerated (){
    List<List<dynamic>> result = List(this.length);
    for(int i = 0; i < this.length; i++)
      result[i] = [i, this[i]];
    return result;
  }
}
  1. 我执行此操作的方式是否有问题,或者您看到的任何缺点
  2. 有没有更好的方法?

这是当前方式的示例用法

var list = ["hello", "world", "this", "is", "an", "example"];
for( var pair in list.enumerated()){
    print('${pair[0]}: ${pair[1]}');
}

2 个答案:

答案 0 :(得分:2)

您可以使用:

for (var entry in list.asMap().entries) {
  print("index: ${entry.key}, value: ${entry.value}");
}

如果您想编写更直接的内容,您的方法很好。我将为索引和值使用一个类,以便可以正确键入。也许:

class IndexedValue<T> {
  final int index;
  final T value;
  Pair(this.index, this.value);
}
extension EnumerateExt<T> on List<T> {
  Iterable<IndexedValue<T>> get enumerated sync {
    var i = 0;
    for (var value in this) yield IndexedValue(i++, value);
  }
}

然后您可以按以下方式遍历索引:

  for (var iv in list.enumerated) {
    print("index: ${iv.index}, value: ${iv.value}");
  }

答案 1 :(得分:1)

我们可以使用List for-in直接遍历loop

void main() {
  List<String> testCases =  ['Hello','World','this','is','an','examples'];
  for(var testCase in testCases){
    print('$testCase, ${testCases.indexOf(testCase)}');
  }
}

输出:

Hello, 0
World, 1
this, 2
is, 3
an, 4
example, 5

注意: indexOf返回此列表中[element]的第一个索引。因此重复的元素将不会显示正确的索引。

为此,基于索引的for loop将起作用:

for(int index=0; index<testCases.length; index++){
    print('${testCases[index]}, $index');
  } 

还有asMap(),它返回Map的{​​{1}}形式。 asMap() Doc