¿Dónde está el método de extensión LINQ “Fold”?

95

Encontré en las muestras de Linq de MSDN un método ordenado llamado Fold () que quiero usar. Su ejemplo:

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

Desafortunadamente, no puedo compilar esto, ya sea en su ejemplo o en mi propio código, y no puedo encontrar en ningún otro lugar de MSDN (como los métodos de extensión Enumerable o Array) que mencionen este método. El error que recibo es un simple y antiguo error "no sé nada sobre eso":

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 provienen de Linq (como Select () y Where ()), y estoy "usando System.Linq", así que creo que todo está bien.

¿Existe realmente este método en C # 3.5? Si es así, ¿qué estoy haciendo mal?

Conocido
fuente
3
Consulte el rastro de migas de pan * en la página de muestras a la que hizo referencia; se refiere a C # 3 como un producto futuro. Los productos futuros a menudo cambian antes de su envío. Como los otros mencionados, vea Enumerable. Agregue y diviértase. :) * Centro de desarrolladores de Visual C #> Inicio> Información del producto> Versiones futuras> 101 muestras de LINQ> Operadores agregados
Curt Nichols

Respuestas:

126

Querrá utilizar el Aggregatemétodo de extensión:

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

Consulte MSDN para obtener más información. Le permite especificar una seedexpresión y luego una para calcular valores sucesivos.

Jason
fuente
4
Cabe señalar que tampoco es necesario tener una semilla. Si llama a la sobrecarga que no tiene semilla, el primer elemento de la lista se utiliza como valor agregado inicial y Funcsolo se llama una vez que se alcanza el segundo elemento. Ver: msdn.microsoft.com/en-us/library/vstudio/…
Josh Gallagher
No es fold si entiendo bien: / El fold debería aceptar ambos argumentos de diferentes tipos. Por ejemplo, uno podría usar una cadena como primer argumento y, como segundo argumento, cualquier cosa con ToString(), así devolver una representación de texto de todo el contenedor.
Hi-Angel
@ Hi-Angel, no, el ejemplo es de hecho un pliegue. El <double>compilador infiere automáticamente el parámetro de tipo y, por lo tanto, no es necesario.
kdbanman
1
@ Hi-Angel, py elempuede ser del tipo que desee. Vea esta sobrecarga como se usa en este ejemplo
kdbanman
1
@kdbanman errr, ⁺¹, es realmente interesante por qué en ese tiempo no funcionó para mí ...: / Tienes razón, funciona.
Hi-Angel
42

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

double product = doubles.Aggregate(1.0, (runningProduct, nextFactor) => runningProduct* nextFactor);
Richard Berg
fuente
9
Agregado es un término más familiar en los ámbitos de OO y SQL.
Adam Robinson
3
No conocía la palabra clave CREATE AGGREGATE ( msdn.microsoft.com/en-us/library/ms182741.aspx ) Aprenda algo nuevo todos los días.
Richard Berg
5
Es curioso, nunca he escuchado "agregados" fuera de SQL. WP tiene una lista 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 "Fold" para la familia ML e "Inject" para Smalltalk y amigos.
Ken
12
El nombre depende de su funcionalidad; cómo se implementa es irrelevante. Y FWIW, los pliegues a la izquierda se implementan iterativamente cuando es posible ... en lenguajes funcionales generalmente a través de la recursividad de cola. Y C # no tiene un pliegue correcto, lo que es en parte una consecuencia de elegir un nombre estúpido, aunque no tan malo como "seleccionar" para "mapa", e ignorar la tecnología funcional existente. En cuanto a que Aggregate es un término más familiar en el ámbito de OO ... no, en absoluto.
Jim Balter
9
Para ser justos, no creo que sea el desprecio de Microsoft por la tecnología funcional o la terminología existente, sino su orientación hacia el acceso a la base de datos y la terminología de SQL, con la que muchos programadores empresariales probablemente estén más familiarizados que los términos de programación funcional.
RavuAlHemio