在Dart的集合/列表中获取数字总和的最简洁方法是什么?

Phl*_*das 22 iteration dart

我不喜欢使用索引数组,除了我觉得它看起来很难看.是否有一种与匿名函数相加的简洁方法?是否可以在不使用任何外部变量的情况下完成?

Tob*_*obi 83

这是一个非常古老的问题但是

2022年居然有内置包了

只需导入

import 'package:collection/collection.dart';
Run Code Online (Sandbox Code Playgroud)

并调用.sum上的扩展方法Iterable

完整示例

import 'package:collection/collection.dart';

void main() {
  final list = [1, 2, 3, 4];
  final sum = list.sum;
  print(sum); // prints 10
}
Run Code Online (Sandbox Code Playgroud)

如果列表为空,.sum则返回0

你也可能对此有兴趣list.average...

  • 当然,你可以写 `list.sublist(0,3).sum`,它从索引 0 到排除索引 3 求和 (2认同)

Art*_*ure 30

Dart iterables现在有一个reduce函数(https://code.google.com/p/dart/issues/detail?id=1649),所以你可以简单地做一个总和而不定义你自己的fold函数:

var sum = [1, 2, 3].reduce((a, b) => a + b);
Run Code Online (Sandbox Code Playgroud)

  • 这个答案已经过时了。请考虑这个/sf/answers/4802229421/ (5认同)
  • 如果列表为空,则失败。`.fold()`处理这种情况。 (2认同)

Col*_*oan 17

int sum = [1, 2, 3].fold(0, (previous, current) => previous + current);
Run Code Online (Sandbox Code Playgroud)

或者使用较短的变量名称以减少占用空间:

int sum = [1, 2, 3].fold(0, (p, c) => p + c);
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个答案..为什么减少甚至存在?!我:我想要`.fold` 妈妈:我们家里已经有`.fold` 家里有`.fold`:`.reduce` (5认同)
  • 这应该是公认的答案,因为在空列表上工作更通用。 (2认同)

mda*_*kin 10

我仍然认为对于这个特殊问题,显而易见的方法是更清晰,更容易理解.

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

要么

num sum = 0;
for (num e in [1,2,3]) {
  sum += e;
}
Run Code Online (Sandbox Code Playgroud)


vov*_*ost 8

从 Dart 2.6 开始,您可以使用扩展在列表上定义实用方法。这适用于数字(示例 1),也适用于通用对象(示例 2)。

extension ListUtils<T> on List<T> {
  num sumBy(num f(T element)) {
    num sum = 0;
    for(var item in this) {
      sum += f(item);
    }
    return sum;
  }
}
Run Code Online (Sandbox Code Playgroud)

示例 1(对列表中的所有数字求和):

var numbers = [1, 2, 3];
var sum = numbers.sumBy((number) => number);
Run Code Online (Sandbox Code Playgroud)

示例 2(对所有 Point.x 字段求和):

var points = [Point(1, 2), Point(3, 4)];
var sum = points.sumBy((point) => point.x);
Run Code Online (Sandbox Code Playgroud)


Lar*_*ann 6

现在使用核心库没有一种干净的方法,但是如果你使用自己的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;
}
Run Code Online (Sandbox Code Playgroud)

我和Dart团队讨论了将foldLeft添加到核心集合中的问题,我希望它很快就会存在.

  • 请注意,已经有一些用于处理集合的外部库 - 其中一些在此主题中提到:http://groups.google.com/a/dartlang.org/group/misc/browse_thread/thread/0628027441ad1ac8/329810f9fa00a866收藏库目前也经历了严重的变化,我希望总和(或至少折叠/缩减)正好进入它. (2认同)

Mar*_*rcG 5

我只想在 @tmaihoff 的答案中添加一些小细节(关于使用collection.dart包):

sum他谈到的吸气剂仅适用于可迭代的值num,例如List<int>or Set<double>

如果您有表示值的其他对象类型的列表(例如MoneyDecimalRational或任何其他),则必须将其映射到数字。例如,要计算字符串列表中的字符数,您可以执行以下操作:

// Returns 15.
['a', 'ab', 'abc', 'abcd', 'abcde'].map((e) => e.length).sum;
Run Code Online (Sandbox Code Playgroud)

截至 2022 年,另一种方法是使用fast_immutable_collectionssumBy()包的方法:

// Returns 15.
['a', 'ab', 'abc', 'abcd', 'abcde'].sumBy((e) => e.length), 15);
Run Code Online (Sandbox Code Playgroud)

注意:我是包的作者。