2009-08-05 11 views
69

Encontré en MSDN's Linq samples un buen método llamado Fold() que quiero usar. Su ejemplo:¿Dónde está el Método de extensión LINQ "Fold"?

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

Por desgracia, no puedo conseguir esto para compilar, ya sea en su ejemplo o en mi propio código, y no puedo encontrar en ningún otro lugar en MSDN (como Enumerable o métodos de extensión Array) que menciona este método. El error que consigo es un viejo y simple "no sabe nada acerca de que el" error:

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?) 

estoy usando otros métodos que creo que viene de LINQ (como Select() y dónde()), y Estoy "usando System.Linq", así que creo que todo está bien.

¿Este método existe realmente en C# 3.5 y, de ser así, qué estoy haciendo mal?

+3

Eche un vistazo al rastro de migas de pan * en la página de muestras a la que hizo referencia: se refiere a C# 3 como producto futuro. Los productos futuros a menudo cambian antes de enviar. Como los otros mencionados, vea Enumerable. Agrupe y diviértase. :) * Centro de desarrolladores de Visual C#> Inicio> Información del producto> Versiones futuras> 101 muestras LINQ> Operadores agregados –

Respuesta

94

Usted tendrá que usar el método Aggregate extensión:

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

Ver MSDN para más información. Le permite especificar seed y luego una expresión para calcular valores sucesivos.

+2

Debe tenerse en cuenta que tampoco es necesario tener una semilla. Si llama a la sobrecarga que no tiene semilla, entonces el primer elemento de la lista se usa como el valor agregado inicial y el 'Func' solo se llama una vez que se alcanza el segundo elemento. Ver: https://msdn.microsoft.com/en-us/library/vstudio/bb548651(v=vs.110).aspx –

+0

No se dobla si se me entiende bien:/El doblez debe aceptar ambos argumentos de diferentes tipos. P.ej.uno podría, como primer arg, usar una cadena, y como segundo arg cualquier cosa con 'ToString()', así devolvería una representación de texto de todo el contenedor. –

+0

@ Hi-Angel, no, el ejemplo es, de hecho, un pliegue. El parámetro de tipo '' se deduce automáticamente por el compilador y, por lo tanto, no es necesario. – kdbanman

36

Fold (también conocido como Reducir) es el término estándar de la programación funcional. Por alguna razón, recibió el nombre Aggregate en LINQ.

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

Agregado es un término más familiar en los dominios OO y SQL. –

+2

No tenía conocimiento de la palabra clave CREATE AGGREGATE (http://msdn.microsoft.com/en-us/library/ms182741.aspx) Aprenda algo nuevo todos los días. –

+4

Gracioso, nunca escuché "agregado" fuera de SQL. WP tiene una lista http://en.wikipedia.org/wiki/Fold_(higher-order_function) de un par de docenas de idiomas y C# es el único que lo llama "Agregado". "Reducir" es el claro ganador, seguido de "Plegar" para la familia ML, y "Inyectar" para Smalltalk y sus amigos. – Ken

Cuestiones relacionadas