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

时间:2012-05-01 22:36:39

标签: iteration dart

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

13 个答案:

答案 0 :(得分:21)

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

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

答案 1 :(得分:7)

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

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;
}

答案 2 :(得分:7)

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

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

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

答案 3 :(得分: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;
}

我与Dart团队讨论了将 foldLeft 添加到核心馆藏中的问题,我希望很快就会有。

答案 4 :(得分:1)

您可以使用以下内容;

bars

答案 5 :(得分:1)

从Dart 2.6开始,您可以使用扩展在List上定义实用程序方法。这适用于数字(示例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;
  }
}

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

var numbers = [1, 2, 3];
var sum = numbers.sumBy((number) => number);

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

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

答案 6 :(得分:1)

如果您打算对列表进行一些数学运算,那么通过扩展 ListBase 创建另一种包含 .sum() 和其他运算的列表类型可能会有所帮助。其中一部分是 inspired by this responseperformance tweaks from this response

import 'dart:collection';
import 'dart:core';

class Vector<num> extends ListBase<num> {
  
  List<num> _list;
  Vector() : _list = new List<num>();
  Vector.fromList(List<num> lst): _list = lst;
  
  void set length(int l) {
    this._list.length=l;
  }

  int get length => _list.length;
  
  num operator [](int index) => _list[index];

  void operator []=(int index, num value) {
    _list[index]=value;
  }
  // Though not strictly necessary, for performance reasons
  // you should implement add and addAll.

  void add(num value) => _list.add(value);

  void addAll(Iterable<num> all) => _list.addAll(all);
  
  num sum() => _list.fold(0.0, (a, b) => a + b) as num;
  /// add additional vector functions here like min, max, mean, factorial, normalize etc

}

并像这样使用它:

Vector vec1 = Vector();
vec1.add(1); 
print(vec1); // => [1]
vec1.addAll([2,3,4,5]); 
print(vec1); // => [1,2,3,4,5]
print(vec1.sum().toString()); // => 15
Vector vec = Vector.fromList([1.0,2.0,3.0,4.0,5.0]); // works for double too.
print(vec.sum().toString()); // => 15

答案 7 :(得分:1)

这是一个非常古老的问题,但在 2021 年实际上有一个内置包

直接导入

import 'package:collection/collection.dart';

并调用 .sum 上的 Iterable 分机。

完整示例

import 'package:collection/collection.dart';

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

您可能还对list.average...

感兴趣

答案 8 :(得分:0)

import 'package:queries/collections.dart';

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

答案 9 :(得分:0)

我建议您在任何通用实用程序文件中创建此功能。

T sum<T extends num>(T lhs, T rhs) => lhs + rhs;

int,double,float扩展了num类,因此您可以使用该函数求和任何数字。

例如

List<int> a = [1,2,3];
int result = a.reduce(sum);
print(result); // result will be 6

答案 10 :(得分:0)

在此分享我的方法:

void main() {
  int value = sumTwo([1, 4, 3, 43]);
  print(value);
}

int sumTwo(List < int > numbers) {
  int sum = 0;

  for (var i in numbers) {
    sum = sum + i;
  }
  return sum;
}

答案 11 :(得分:0)

对我来说很有效的解决方案是:

var total => [1,2,3,4].fold(0, (e, t) => e + t); // result 10

答案 12 :(得分:-1)

对我来说,使用forEach是最好的方法。对于此示例,列表名称:myList,包含三个元素。

var myList = [1,2,3]; 

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