• No results found

Output 3: Program Management and M&E Systems Enhanced a

D. Consultants’ Terms of Reference

Los métodos para realizar las operaciones de agregación, son los que se enumeran a continuación, todos ellos (salvo Aggregate) ya los vimos en la sección Funciones de agregado del capítulo ante- rior.  Aggregate  Average  Count  LongCount  Max

 Min  Sum

El método Aggregate permite realizar una operación de agregado (o acumulación) en una colección. No debemos confundir este método con la cláusula del mismo nombre que define Visual Basic, ya que no hay una equivalencia exacta, en Visual Basic esa cláusula se utiliza para realizar operaciones de agregación, pero usando las funciones de agregado, tanto las definidas en .NET Framework (las mostradas en la lista anterior) o las que nosotros podamos definir en nuestro código (en el capítulo anterior vimos cómo definirlas y cómo usarlas tanto desde Visual Basic como desde C#).

El método Aggregate define tres sobrecargas, según se indique o no un valor inicial (semilla) y si se quiere realizar una transformación (similar al uso de la cláusula select) en el valor devuelto. Veamos ejemplos de cómo utilizar las tres sobrecargas.

En el listado 8.40 vemos dos formas de sumar el contenido de una colección numérica, en el primer caso, usamos el método Aggregate al que le pasamos una expresión lambda con la operación de acumulación que queremos hacer, la primera variable de esa función anónima será la que mantenga el valor acumulado, y la segunda la que representa a cada elemento. El valor inicial que tendrá la variable usada como acumulador será el primer elemento del array. En la segunda asignación usamos la función Sum que hace eso mismo. En ambos casos, el valor devuelto es 15, que es la suma de todos los valores del array nums.

var nums = new[] { 1, 2, 3, 4, 5 };

var suma1 = nums.Aggregate((t, n) => t + n);

Console.WriteLine(suma1);

var suma2 = nums.Sum();

Console.WriteLine(suma2);

Listado 8.40. Dos formas de sumar todos los valores de una colección numérica

Las otras dos sobrecargas del método Aggregate permiten indicar el valor inicial del acumulador (semilla), (de esta forma, se usará ese valor en lugar del primer elemento de la colección) y si se debe usar una expresión lambda para indicar cuál será el elemento resultante.

En el listado 8.41 vemos un ejemplo de la sobrecarga en la que solo se indica la semilla y la operación de acumulación que queremos realizar. En este caso, el valor inicial será 10 y se hará la misma ope- ración que en el ejemplo anterior, es decir, se sumarán todos los valores del array al que se le aplica este método. Por tanto, el resultado será 25 (10 + 15).

var suma3 = nums.Aggregate(10, (t, n) => t + n);

Console.WriteLine(suma3);

Listado 8.41. Aggregate podemos usarlo indicando el valor inicial del acumulador

En el listado 8.42 usamos la sobrecarga en la que además del valor inicial de la semilla y la expresión

lambda que usaremos para la operación de acumulación, también indicamos cómo queremos que se

devuelva ese valor. En este ejemplo, creamos una cadena con el valor a devolver. En esta segunda expresión lambda, el valor que se recibe es el total acumulado.

var suma4 = nums.Aggregate( 10,

(t, n) => t + n,

t => "El total es " + t);

Console.WriteLine(suma4);

Listado 8.42. Con Aggregate también podemos indicar cómo devolver el valor acumulado

En el listado 8.43 vemos una versión de los métodos SumaPares y SumaImpares (de los listados 7.62 y 7.63 del capítulo anterior) en las que usamos el método Aggregate para sumar los números pares o impares de una colección de tipo entero.

public static class ExtensionesAgregados

{

public static int SumaPares(this IEnumerable<int> source) {

return source.Aggregate(

0, (t, n) => t + (n % 2 == 0 ? n : 0) );

}

public static int SumaImpares(this IEnumerable<int> source) { return source.Aggregate( 0, (t, n) => t + (n % 2 == 0 ? 0 : n) ); } }

Listado 8.43. Versiones de las funciones de agregado definidas en el capítulo anterior en las que usamos el método Aggregate para realizar la suma de los valores

Estos ejemplos que he usado para mostrar cómo se utiliza el método Aggregate solo han sido para que veamos cómo podemos usarlo (elemental querido Guille) ya que no tienen mucha utilidad, puesto que para acumular valores de esta forma tenemos el método Sum, que como ya vimos en el capítulo anterior, le podemos pasar la expresión lambda que se aplicará para sumar cada elemento, por tanto, para sumar los valores pares e impares del array nums podríamos usar el código del listado 8.44 en el que las expresiones lambda usadas en el método Sum tendrán en cuenta si el número es par o impar (según sea el caso).

// Los impares

var suma9 = nums.Sum(n => n % 2 == 0 ? 0 : n);

Console.WriteLine("Suma de los impares: {0}", suma9);

// Los pares

var suma10 = nums.Sum(n => n % 2 == 0 ? n : 0);

Console.WriteLine("Suma de los pares: {0}", suma10);

Listado 8.44. El método Sum hace perfectamente todo lo que acabamos de ver si usamos la expresión lambda adecuada

Versiones

Esta característica solo la podemos usar con .NET Framework 3.5 y debemos tener una referencia a System.Linq.dll (todas las plantillas de proyectos de Visual C# 2008 incluyen esa referencia).

Capí tuló 9

C# y LINQ (IV)

Introducción

En este capítulo nos vamos a centrar en las características de lo que se conoce como LINQ to XML, pero desde el punto de vista del programador de C#. Como seguramente sabrá el lector, Visual Basic se compenetra totalmente con todo lo relacionado con esta tecnología, de forma que incluso permite el uso de literales XML directamente en el código, pero esto en C# no es así, ya que tendremos que usar las clases definidas en el espacio de nombres System.Xml.Linq en lugar de literales XML.

Related documents