Iterable.indexed în Dart

Perechi (poziție, element) pentru fiecare element, utile în for-in cu destructurare.

Sintaxă
Iterable<(int, E)> get indexed

Ce face Iterable.indexed

indexed (Dart 3.0) returnează un iterable leneș de records (int, E): poziția elementului, de la 0, și elementul. Cu pattern-uri îl desfaci direct în buclă: for (final (i, x) in lista.indexed).

Merge pe orice iterable, nu doar pe liste: pe un set, pe cheile unui map sau pe rezultatul lui where. Pe liste, alternativa mai veche este asMap().

Ce returnează

Un Iterable<(int, E)> leneș.

Exemple

Exemplul 1: Clasament numerotat

void main() {
  final clasament = ['Ana', 'Mihai', 'Ioana'];
  for (final (i, nume) in clasament.indexed) {
    print('${i + 1}. $nume');
  }
  print(clasament.indexed.toList());
}

Rezultat

1. Ana
2. Mihai
3. Ioana
[(0, Ana), (1, Mihai), (2, Ioana)]

Exemplul 2: Pozițiile elementelor care trec un test

void main() {
  final temperaturi = [18, 31, 25, 33, 29];
  final pozitii = temperaturi.indexed.where((p) => p.$2 > 30).map((p) => p.$1);
  print('Zile caniculare (poziții): ${pozitii.toList()}');
}

Rezultat

Zile caniculare (poziții): [1, 3]

Greșeli frecvente

  • Inversezi ordinea în record: primul câmp ($1) este poziția, al doilea ($2) este elementul.

Comenzi înrudite

  • List.asMap: Privește lista ca un Map nemodificabil de la poziție la element.
  • Iterable.elementAt: Returnează elementul de la o poziție; elementAtOrNull returnează null dacă poziția nu există.
  • Iterable.map: Transformă fiecare element cu o funcție și returnează un iterable nou, leneș, cu rezultatele.