2009-08-05 15 views
69

Ho trovato in MSDN's Linq samples un metodo pulito chiamato Fold() che voglio usare. Il loro esempio:Dov'è il metodo di estensione LINQ "Piegatura"?

double[] doubles = { 1.7, 2.3, 1.9, 4.1, 2.9 }; 
double product = 
    doubles.Fold((runningProduct, nextFactor) => runningProduct * nextFactor); 

Purtroppo, non posso ottenere questo per compilare, sia nella loro esempio o nel mio proprio codice, e non riesco a trovare altrove in MSDN (come Enumerable o metodi di estensione Array) che menziona questo metodo L'errore che ottengo è una pianura vecchio "non so nulla" errore:

error CS1061: 'System.Array' does not contain a definition for 'Fold' and no 
extension method 'Fold' accepting a first argument of type 'System.Array' could 
be found (are you missing a using directive or an assembly reference?) 

sto usando altri metodi che credo provengono da Linq (come Select() e dove()), e Sto "usando System.Linq", quindi penso che sia tutto OK.

Questo metodo esiste davvero in C# 3.5 e, in caso affermativo, cosa sto facendo male?

+3

Controllare la traccia di mollica di pane * nella pagina degli esempi a cui si fa riferimento - si riferisce a C# 3 come prodotto futuro. I prodotti futuri cambiano spesso prima della spedizione. Come gli altri citati, vedi Enumerable.Aggregate e divertiti. :) * Centro per sviluppatori Visual C#> Home> Informazioni sul prodotto> Versioni future> 101 Esempi LINQ> Operatori aggregati –

risposta

94

Si vuole utilizzare il metodo Aggregate estensione:

double product = doubles.Aggregate(1.0, (prod, next) => prod * next); 

Vedi MSDN per ulteriori informazioni. Ti consente di specificare un seed e quindi un'espressione per calcolare i valori successivi.

+2

Va notato che non è necessario avere un seme, neanche. Se chiami il sovraccarico che non ha seed, il primo elemento dell'elenco viene utilizzato come valore di aggregazione iniziale e il 'Func' viene chiamato solo quando viene raggiunto il secondo elemento. Vedi: https://msdn.microsoft.com/en-us/library/vstudio/bb548651(v=vs.110).aspx –

+0

Non è fold se ho capito bene:/La piega dovrebbe accettare entrambi gli argomenti di tipi diversi. Per esempio.uno potrebbe come primo argomento usare una stringa, e come il secondo argomento con 'ToString()', restituisce quindi una rappresentazione testuale dell'intero contenitore. –

+0

@ Hi-Angel, no, l'esempio è in realtà una piega. Il parametro di tipo '' viene automaticamente dedotto dal compilatore e quindi non è necessario. – kdbanman

36

Fold (aka Riduzione) è il termine standard della programmazione funzionale. Per qualsiasi motivo, è stato chiamato Aggregate in LINQ.

double product = doubles.Aggregate(1.0, (runningProduct, nextFactor) => runningProduct* nextFactor); 
+8

Aggregato è un termine più familiare nei domini OO e SQL. –

+2

Non era a conoscenza della parola chiave CREATE AGGREGATE (http://msdn.microsoft.com/en-us/library/ms182741.aspx) Impara qualcosa di nuovo ogni giorno. –

+4

Divertente, non ho mai sentito "aggregare" al di fuori di SQL. WP ha una lista http://en.wikipedia.org/wiki/Fold_(higher-order_function) di una dozzina di lingue e C# è l'unica che la chiama "Aggregate". "Reduce" è il chiaro vincitore, seguito da "Fold" per la famiglia ML e "Inject" per Smalltalk e gli amici. – Ken

Problemi correlati