有没有办法在 Dart 中获取类似于 Swift 的 List.enumerated() 方法的功能?



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

您可以使用:

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

我们可以使用for-inloop直接迭代List

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] 的第一个索引。因此,重复的元素不会显示正确的索引。

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

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

还有asMap()它返回ListMap形式。 asMap(( Doc

最新更新