Перечислять или отображать в списке с индексом и значением в дартс

В дротике есть какой-то эквивалент общего:

enumerate(List) -> Iterator((index, value) => f)
or 
List.enumerate()  -> Iterator((index, value) => f)
or 
List.map() -> Iterator((index, value) => f)

Кажется, это самый простой способ, но все же странно, что эта функциональность не существует.

Iterable<int>.generate(list.length).forEach( (index) => {
  newList.add(list[index], index)
});

Edit:

Благодаря @hemanth-raj я смог найти решение, которое искал. Я положу это здесь для тех, кому нужно сделать что-то подобное.

List<Widget> _buildWidgets(List<Object> list) {
    return list
        .asMap()
        .map((index, value) =>
            MapEntry(index, _buildWidget(index, value)))
        .values
        .toList();
}

В качестве альтернативы вы можете создать функцию синхронного генератора, которая будет возвращать итерируемый

Iterable<MapEntry<int, T>> enumerate<T>(Iterable<T> items) sync* {
  int index = 0;
  for (T item in items) {
    yield MapEntry(index, item);
    index = index + 1;
  }
}

//and use it like this.
var list = enumerate([0,1,3]).map((entry) => Text("index: ${entry.key}, value: ${entry.value}"));

Ответы

Ответ 1

Существует метод asMap который преобразует список в карту, где ключи - это индекс, а значения - это элемент в индексе. Пожалуйста, посмотрите на документы здесь.

Пример:

List _sample = ['a','b','c'];
_sample.asMap().forEach((index, value) => f);

Надеюсь это поможет!

Ответ 2

Пакет Lukas Renggli more включает в себя множество полезных инструментов, включая "indexed", который делает именно то, что вы хотите. Из документов:

indexed(['a', 'b'], offset: 1)
  .map((each) => '${each.index}: ${each.value}')
  .join(', ');

(Вы можете игнорировать аргумент смещения, если у вас нет фона Smalltalk :-).

Ответ 3

Опираясь на ответ @Hemanth Raj.

Чтобы преобразовать его обратно, вы можете сделать

List<String> _sample = ['a', 'b', 'c'];
_sample.asMap().values.toList(); 
//returns ['a', 'b', 'c'];

Или, если вам нужен индекс для функции отображения, вы можете сделать это:

_sample
.asMap()
.map((index, str) => MapEntry(index, str + index.toString()))
.values
.toList();
// returns ['a0', 'b1', 'c2']

Ответ 4

Нет встроенной функции для получения индекса итерации.

Если вам, как и мне, вам не нравится идея построить Map (структуру данных) только для простого индекса, то вам, вероятно, понадобится map (функция), которая дает вам индекс. Пусть call это mapIndexed (как в Kotlin):

children: mapIndexed(
  list,
  (index, item) => Text("event_$index")
).toList();

Реализация mapIndexed проста:

Iterable<E> mapIndexed<E, T>(
    Iterable<T> items, E Function(int index, T item) f) sync* {
  var index = 0;

  for (final item in items) {
    yield f(index, item);
    index = index + 1;
  }
}