Агрегированные лямбда-выражения - PullRequest
3 голосов
/ 30 июня 2010
int sum0 = 0;
for (int i = 0; i < 10; i++)
{
    sum0 += i;
}

int sum1 = Enumerable.Range(0, 10).Sum();
int sum2 = Enumerable.Range(0, 10).Aggregate((x, y) => x + y);
int sum3 = Enumerable.Range(0, 10).Aggregate(0, (x, y) => x + y);

Все вышеперечисленные 4 выражения делают одно и то же: находят сумму от 0 до 10. Я понимаю вычисление сумм 0 и сум1. Но что такое sum2 и sum3? Почему лямбда использует здесь два параметра (x, y)?

Ответы [ 7 ]

5 голосов
/ 30 июня 2010

Расширяя ответ bdukes, лямбда принимает

( x = [value of last lambda expression], y = [next value] ) => x+y

и sum3 позволяют вам установить начальное значение x.

3 голосов
/ 30 июня 2010

Метод Enumerable.Aggregate ожидает функцию, которая получает текущее значение агрегации и значение из перечисления. Перегрузка для sum3 также обеспечивает начальное значение для агрегации.

0 голосов
/ 30 июня 2010

Параметр x содержит агрегацию, а y - следующий элемент перечисления.

string sentence = "the quick brown fox jumps over the lazy dog";

// Split the string into individual words.
string[] words = sentence.Split(' ');

// Prepend each word to the beginning of the 
// new sentence to reverse the word order.
string reversed = words.Aggregate((workingSentence, next) =>
                                  next + " " + workingSentence);

Console.WriteLine(reversed);

// This code produces the following output:
//
// dog lazy the over jumps fox brown quick the

от http://msdn.microsoft.com/en-us/library/bb548651.aspx

0 голосов
/ 30 июня 2010

x - это переменная, которая «накапливает» значения, поэтому ее значение равно

step 1) 1
step 2) 3
step 3) 6
step 4) 10

и так далее ...

0 в sum3 является начальным значением :) (которое является избыточным, поскольку 0 является значением по умолчанию для int)

0 голосов
/ 30 июня 2010

sum2 использует пользовательскую функцию x + y для агрегирования каждого элемента списка. Агрегирование начинается со значения по умолчанию для целого числа 0 и добавляет к нему первый элемент. Затем он принимает это значение и добавляет следующий элемент и т. Д., Пока в нем не закончатся элементы. Затем возвращается окончательная цифра.

sum3 делает то же самое, что и sum2, но также явно запускает агрегацию с определенным значением 0.

Семантически все три одинаковы - как представлено здесь - но изменяя функцию агрегации и начальное начальное значение, вы можете генерировать все виды пользовательских агрегатов.

Другой способ взглянуть на это так: .Sum() - это просто сокращение для .Aggregate(0, (x, y) => x + y);.

0 голосов
/ 30 июня 2010

Методы расширения Aggregate принимают функцию (Func<T1,T2,TResult>), которая вычисляет агрегат.

Функция, указанная для sum2, добавляет x кy, для каждого поставляемого x и y (то есть он суммирует все элементы в перечислении).

Дополнительным параметром для sum3 является аккумулятор - значение, которое должно бытьдобавляется для каждой операции - так как это 0, это, по сути, суммирование всех элементов в перечислении без каких-либо дополнительных значений.

0 голосов
/ 30 июня 2010

X содержит текущую сумму, к каждому элементу добавляется Y.

Foreach (y) X = X + Y;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...