114 votes

Quelle est la façon la plus propre d'obtenir la somme des nombres dans une collection / liste en Dart ?

Je n'aime pas utiliser un tableau indexé pour aucune raison autre que je trouve ça moche. Y a-t-il un moyen propre de faire la somme avec une fonction anonyme ? Est-il possible de le faire sans utiliser de variables extérieures ?

8voto

vovahost Points 1123

À partir de Dart 2.6, vous pouvez utiliser des extensions pour définir une méthode utilitaire sur la liste. Cela fonctionne pour les nombres (exemple 1) mais aussi pour les objets génériques (exemple 2).

extension ListUtils on List {
  num sumBy(num f(T element)) {
    num sum = 0;
    for(var item in this) {
      sum += f(item);
    }
    return sum;
  }
}

Exemple 1 (additionner tous les nombres de la liste):

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

Exemple 2 (additionner tous les champs Point.x):

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

5voto

marcg Points 110

Je voudrais simplement ajouter quelques petits détails à la réponse de @tmaihoff (à propos de l'utilisation du package collection.dart):

Le getter sum dont il parle ne fonctionne que pour des itérables de valeurs num, comme List ou Set.

Si vous avez une liste d'autres types d'objets qui représentent des valeurs (comme Money, Decimal, Rational, ou d'autres) vous devez la mapper en nombres. Par exemple, pour compter le nombre de caractères dans une liste de chaînes de caractères, vous pouvez faire :

// Retourne 15.
['a', 'ab', 'abc', 'abcd', 'abcde'].map((e) => e.length).sum;

En 2022, une autre façon de le faire est d'utiliser la méthode sumBy() du package fast_immutable_collections:

// Retourne 15.
['a', 'ab', 'abc', 'abcd', 'abcde'].sumBy((e) => e.length), 15);

Remarque : Je suis l'auteur du package.

3voto

임승기 Points 31

Je vous suggère de créer cette fonction dans tout fichier utilitaire commun.

T sum(T lhs, T rhs) => lhs + rhs;

int, double, float étendent la classe num, donc vous pouvez utiliser cette fonction pour additionner n'importe quels chiffres.

par exemple,

List a = [1,2,3];
int result = a.reduce(sum);
print(result); // le résultat sera 6

3voto

ramkumar Points 1

Voici le partage de mon Approche :

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

2voto

aabiro Points 197

Si lors de l'utilisation de fold, vous obtenez une erreur de type double, vous pouvez utiliser reduce :

var sum = [0.0, 4.5, 6.9].reduce((a, b) => a + b);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X