Каков самый чистый способ получить сумму чисел в коллекции/списке в Dart?

Мне не нравится использовать индексированный массив без каких-либо причин, кроме как я думаю, что он выглядит уродливым. Есть ли простой способ суммировать анонимную функцию? Можно ли это сделать без использования каких-либо внешних переменных?

Ответ 1

Теперь итераторы Dart имеют функцию уменьшения (https://code.google.com/p/dart/issues/detail?id=1649), поэтому вы можете сделать сумму достоверно, не определяя свою собственную функцию сгиба:

var sum = [1, 2, 3].reduce((a, b) => a + b);

Ответ 2

int sum = [1, 2, 3].fold(0, (previous, current) => previous + current);

или с более короткими именами переменных, чтобы уменьшить занятость:

int sum = [1, 2, 3].fold(0, (p, c) => p + c);

Ответ 3

Я все еще думаю, что очевидный путь более чист и понятен для этой конкретной проблемы.

num sum = 0;
[1, 2, 3].forEach((num e){sum += e;});
print(sum);

или

num sum = 0;
for (num e in [1,2,3]) {
  sum += e;
}

Ответ 4

Нет чистого способа сделать это, используя основные библиотеки, как сейчас, но если вы перевернете свой собственный foldLeft, то есть

main() {
  var sum = foldLeft([1,2,3], 0, (val, entry) => val + entry);
  print(sum);
}

Dynamic foldLeft(Collection collection, Dynamic val, func) {
  collection.forEach((entry) => val = func(val, entry));
  return val;
}

Я поговорил с командой Дарта о добавлении foldLeft в основные коллекции, и я надеюсь, что он скоро появится.

Ответ 5

import 'package:queries/collections.dart';

void main() {
  var data = [0, 1, 2, null, 3];  
  var sum = Collection(data).sum();
  print(sum);
}

Ответ 6

Вы можете использовать следующее:

var list = [1, 2, 3];
var sum = list.reduce((curr, next) => curr + next);
var sum2 = list.fold(0, (curr, next) => curr + next);
print('$sum, $sum2'); // Output: 6, 6

Ответ 7

Для меня использование forEach - лучший способ. Для этого примера название списка: myList с тремя элементами.

var myList = [1,2,3]; 

num sum=0;
myList.forEach((Iterable){sum += Iterable;});
print(sum);