Saltar al contenido

Cómo y por qué usar delegados en C#

Si usas LINQ, ya lo has hecho. Considera este ejemplo:

12int[] números ={1,5,1000,10};var bigNumbers = números.Where(n =§; n >999);

csharp

Cómo y por qué usar delegados en C#
Cómo y por qué usar delegados en C#

En realidad estamos creando una Func anónima – una función que toma una int y devuelve verdadero o falso – y pasando la función como un parámetro al método Where. Entonces el método Where ejecuta esa función para cada elemento de la lista para ver si es verdadero o falso.

Si nuestra clase tuviera una función con la misma firma, como:

1boolIsBigNumber(int number)={{número de int...}; number >499;

csharp

Entonces podríamos pasar esa función como un parámetro a «Dónde»:

1var bigNumbers = números.Where(IsBigNumber);

csharp

Podemos escribir nuestros propios métodos que tienen funciones como parámetros. Por ejemplo, este método genérico toma una Lista y una Func y la utiliza para devolver todos los elementos de la lista en los que la condición no es verdadera:

1234List<T;Excluir<T;T;;(List<T;valores, Func<T,bool;;condición){Valores de retorno.Where(value=§;!condition(value)).ToList();}

csharp

Funciona tomando la Func que se pasó al método Exclude y pasando esa función al método Where.

Funciones que devuelven funciones

También podemos devolver funciones de una función. Supongamos que vamos a filtrar y clasificar una colección, pero queremos cambiar el orden de clasificación en base a una variable. Podríamos tener un listado para diferentes órdenes de clasificación:

1publicenum SortOrder { Nombre, apellido, fecha de nacimiento }

csharp

Cuando llamamos al método OrderBy de LINQ, le pasamos una función que devuelve el valor por el cual clasificar. Podríamos escribir una función que usa una variable y determina qué propiedad de una persona por la cual ordenar:

123456789101112Func<Persona, IComparable;GetSortFunction(SortOrder sortOrder){switch(sortOrder){case SortOrder.FirstName:return person =§; person.FirstName;case SortOrder.BirthDate:return person =§; person.BirthDate;default:return person =§; person.LastName;}}

csharp

Entonces podemos usar esa variable de la siguiente manera:

12345IEnumerable<Persona;SortAndFilter(IEnumerable<Persona;};Personas,SortOrder sortOrder){var sortFunction =GetSortFunction(sortOrder);return people.Where(person =§; persona.Activa).OrderBy(sortFunction);}

csharp

Estamos devolviendo un delegado (un Func) de una función, y usándolo como parámetro para otra función (OrderBy).