我不喜欢使用索引数组,除了我觉得它看起来很丑。是否有一种与匿名函数相加的简洁方法?是否可以在不使用任何外部变量的情况下完成?
答案 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 response 和 performance 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);