Looking for c# Keywords? Try Ask4Keywords

C# Language заполнитель


пример

Aggregate Применяет функцию аккумулятора по последовательности.

int[] intList = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sum = intList.Aggregate((prevSum, current) => prevSum + current);
// sum = 55
  • На первом этапе prevSum = 1
  • На втором prevSum = prevSum(at the first step) + 2
  • На i-м шаге 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 !"

Вторая перегрузка Aggregate также получает параметр seed который является начальным значением аккумулятора. Это можно использовать для вычисления нескольких условий в коллекции без повторения его более одного раза.

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

Для сбора items мы хотим рассчитать

  1. Общее количество .Count
  2. Количество четных чисел
  3. Соберите каждый четвертый пункт

Используя Aggregate это можно сделать следующим образом:

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]

Обратите внимание, что использование анонимного типа в качестве семени должно создавать новый объект для каждого элемента, потому что свойства доступны только для чтения. Используя пользовательский класс, вы можете просто назначить информацию, а new не нужен (только при задании начального параметра seed