web-dev-qa-db-ja.com

Dartのコレクション/リストの数値の合計を取得する最もクリーンな方法は何ですか?

見た目が醜いと思う以外の理由で、インデックス付き配列を使用するのは好きではありません。匿名関数で合計するクリーンな方法はありますか?外部変数を使用せずにそれを行うことは可能ですか?

30
Phlox Midas

Dart iterablesにreduce関数( https://code.google.com/p/Dart/issues/detail?id=1649 )が追加されたため、独自のフォールドを定義せずに合計を簡単に実行できます。関数:

var sum = [1, 2, 3].reduce((a, b) => a + b);
24
ArthurDenture
int sum = [1, 2, 3].fold(0, (previous, current) => previous + current);

または、変数名を短くして場所を取らないようにします。

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

私はまだ、この特定の問題について、明白な方法がよりクリーンで理解しやすいと思います。

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

現在のようにコアライブラリを使用してそれを行うためのクリーンな方法はありませんが、独自のライブラリをロールする場合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をコアコレクションに追加することについてDartチームと話しましたが、すぐにそこにあることを願っています。

6
Lars Tackmann
import 'package:queries/collections.Dart';

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

以下を使用できます。

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
0
shtanriverdi

この関数は、一般的なユーティリティファイルで作成することをお勧めします。

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
0
임승기