C# Language Aggregato

Esempio

Aggregate Applica una funzione di accumulatore su una sequenza.

int[] intList = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sum = intList.Aggregate((prevSum, current) => prevSum + current);
// sum = 55
  • Al primo passo prevSum = 1
  • Al secondo prevSum = prevSum(at the first step) + 2
  • Al passo i-esimo prevSum = prevSum(at the (i-1) step) + i-th element of the array passo 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 !"

Un secondo overload di Aggregate riceve anche un parametro seed che è il valore dell'accumulatore iniziale. Questo può essere usato per calcolare più condizioni su una collezione senza iterarlo più di una volta.

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

Per la raccolta di items che vogliamo calcolare

  1. Il totale .Count
  2. La quantità di numeri pari
  3. Colleziona ogni singolo oggetto

Usando Aggregate può essere fatto in questo modo:

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]

Si noti che l'utilizzo di un tipo anonimo come seed deve istanziare un nuovo oggetto ogni elemento perché le proprietà sono di sola lettura. Usando una classe personalizzata si può semplicemente assegnare l'informazione e non è necessario alcun new (solo quando si fornisce il parametro iniziale del seed