2013-03-13 6 views
3

Я стараюсь думать о том, как лучше всего это сформулировать, чтобы перейти к моему точному вопросу, не имея необходимости объяснять что делает Агрегат, потому что я знаю, что это было подробно описано здесь и в других местах в Интернете. При вызове Aggregate() и использовании оператора linq, такого какЧто такое a & b для .Aggregate ((a, b) => statement w/a & b)

(a,b) => a+b 

Что такое a и что такое b? Я знаю, что это текущий элемент, но что такое b? Я видел примеры, когда казалось, что b - это всего лишь один элемент впереди и других примеров, где это похоже на результат предыдущей функции и другие примеры, где, как представляется, b был результатом предыдущей функции.

Я просмотрел примеры на реальных C# страниц документации здесь http://msdn.microsoft.com/en-us/library/bb548744.aspx и здесь http://www.dotnetperls.com/aggregate

Но я просто нужно некоторое разъяснение разницы между двумя аргументами в выражении Linq. Если мне не хватает какого-то фундаментального знания Linq, которое отвечает на это, не стесняйтесь меня на место.

+0

Это зависит от того, какую подпись вы вызываете. – SLaks

+0

a и b - параметры передатчика лямбда, передаваемого в агрегат. Их типы (если вы не получите ошибку компилятора), выведенные компилятором C#, будут различаться в зависимости от контекста и вызываемого метода расширения, и могут быть определены путем зависания над ними в RHS лямбда. –

ответ

2

a не является текущим элементом - b есть. В первый раз, когда вызывается лямбда-выражение, a будет равен аргументу seed, который вы указали Aggregate. Каждый последующий раз он будет равен результату предыдущего вызова лямбда-выражения.

+0

Все ответы были правильными и помогли мне понять, что происходит, но я чувствовал, что этот был наиболее кратким. – SmashCode

3

Если вы вызываете перегрузку, которая принимает Func соответствие этому описанию, вы, скорее всего, с помощью этой версии:

Enumerable.Aggregate

Это означает, что a бы ваш аккумулятор и b бы быть следующий элемент для работы.

someEnumerable.Aggregate((a,b) => a & b); 

Если вы расширить, что к очередному циклу, это может выглядеть примерно так:

Sometype a = null; 

foreach(var b in someEnumerable) 
{ 
    if(a == null) 
    { 
     a = b; 
    } 
    else 
    { 
     a = a & b; 
    } 
} 

бы выполнить побитовый-и и сохранить результат в аккумулятор.

3

Посмотрите на пример на http://msdn.microsoft.com/en-us/library/bb548651.aspx

 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 

В этом примере анонимная функция передается Aggregate является (workingSentence, next) => next + " " + workingSentence. a будет workingSentence, который содержит результат агрегации до текущего элемента, а b - это текущий элемент, добавляемый к агрегации. При первом вызове анонимной функции workingSentence = "" и next = "the". В следующем вызове workingSentence = "the" и next = "quick".

Смежные вопросы