在 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;
}
}
- 我这样做的方式有什么问题,或者你看到的任何缺点
- 有没有办法让它变得更好?
这是它当前方式的示例用法
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-in
loop
直接迭代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] 的第一个索引。因此,重复的元素不会显示正确的索引。
为此,基于索引的for
loop
将起作用:
for(int index=0; index<testCases.length; index++){
print('${testCases[index]}, $index');
}
还有asMap()
它返回List
的Map
形式。 asMap(( Doc