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
En realidad estamos creando una Func
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).