C# Language Agrégat


Exemple

Aggregate Applique une fonction d'accumulateur sur une séquence.

int[] intList = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sum = intList.Aggregate((prevSum, current) => prevSum + current);
// sum = 55
  • Au premier pas prevSum = 1
  • Au second prevSum = prevSum(at the first step) + 2
  • A la iième étape prevSum = prevSum(at the (i-1) step) + i-th element of the array
string[] stringList = { "Hello", "World", "!" };
string joinedString = stringList.Aggregate((prev, current) => prev + " " + current);
// joinedString = "Hello World !"

Une deuxième surcharge de l' Aggregate reçoit également un paramètre d' seed qui correspond à la valeur initiale de l'accumulateur. Cela peut être utilisé pour calculer plusieurs conditions sur une collection sans l'itérer plus d'une fois.

List<int> items = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

Pour la collection d' items nous voulons calculer

  1. Le total .Count
  2. La quantité de nombres pairs
  3. Ramassez chaque article

En utilisant Aggregate cela peut se faire comme ceci:

var result = items.Aggregate(new { Total = 0, Even = 0, FourthItems = new List<int>() },
                (accumelative,item) =>
                new {
                    Total = accumelative.Total + 1,
                    Even = accumelative.Even + (item % 2 == 0 ? 1 : 0),
                    FourthItems = (accumelative.Total + 1)%4 == 0 ? 
                        new List<int>(accumelative.FourthItems) { item } : 
                        accumelative.FourthItems 
                });
// Result:
// Total = 12
// Even = 6
// FourthItems = [4, 8, 12]

Notez que si vous utilisez un type anonyme comme graine, vous devez instancier un nouvel objet à chaque élément car les propriétés sont en lecture seule. En utilisant une classe personnalisée peut simplement affecter les informations et aucune new est nécessaire (seulement en donnant la première seed paramètre