Delegados genéricos para manipular matrices y listas
En este tema se ofrece una introducción a los delegados genéricos para conversiones, predicados de búsqueda y acciones realizadas en los elementos de una matriz o colección.
Delegados genéricos para manipular matrices y listas
El delegado genérico Action<T> representa un método que realiza alguna acción en un elemento del tipo especificado. Puede crear un método que realiza la acción deseada en el elemento, crear una instancia del delegado Action<T> para que represente ese método y, después, pasar la matriz y el delegado al método genérico estático Array.ForEach. Se llama al método para cada elemento de la matriz.
La clase genérica List<T> también proporciona un método ForEach que usa el delegado Action<T>. Este método no es genérico.
Nota
Este es un aspecto interesante de los tipos y métodos genéricos. El método Array.ForEach debe ser estático (Shared
en Visual Basic) y genérico porque Array no es un tipo genérico; la única razón por la que se puede especificar un tipo para que Array.ForEach opere sobre él es que el método tiene su propia lista de parámetros de tipo. Por el contrario, el método no genérico List<T>.ForEach pertenece a la clase genérica List<T>, por lo que simplemente utiliza el parámetro de tipo de su clase. La clase está fuertemente tipada, por lo que el método puede ser un método de instancia.
El delegado genérico Predicate<T> representa un método que determina si un determinado elemento cumple los criterios definidos. Puede usar los siguientes métodos genéricos estáticos de Array para buscar un elemento o un conjunto de elementos: Exists, Find, FindAll, FindIndex, FindLast, FindLastIndex y TrueForAll.
Predicate<T> también trabaja con los correspondientes métodos de instancia no genéricos de la clase genérica List<T>.
El delegado genérico Comparison<T> permite proporcionar un criterio de ordenación para los elementos de la matriz o la lista que no tienen un criterio de ordenación nativo, o para reemplazar el criterio de ordenación nativo. Cree un método que realice la comparación, cree una instancia del delegado Comparison<T> para representar el método y, después, pase la matriz y el delegado al método genérico estático Array.Sort<T>(T[], Comparison<T>). La clase genérica List<T> proporciona una sobrecarga del método de instancia correspondiente, List<T>.Sort(Comparison<T>).
El delegado genérico Converter<TInput,TOutput> permite definir una conversión entre dos tipos y convertir una matriz de un tipo en una matriz del otro, o convertir una lista de un tipo a una lista del otro. Cree un método que convierta los elementos de la lista existente a un nuevo tipo, cree una instancia de delegado para representar el método y use el método estático genérico Array.ConvertAll para producir una matriz del nuevo tipo a partir de la matriz original, o el método de instancia genérico List<T>.ConvertAll<TOutput>(Converter<T,TOutput>) para producir una lista del nuevo tipo a partir de la lista original.
Encadenar delegados
Muchos de los métodos que usan estos delegados devuelven una matriz o una lista, que se puede pasar a otro método. Por ejemplo, si quiere seleccionar determinados elementos de una matriz, convertirlos a un nuevo tipo y guardarlos en una nueva matriz, puede pasar la matriz devuelta por el método genérico FindAll al método genérico ConvertAll. Si el nuevo tipo de elemento carece de un criterio de ordenación natural, puede pasar la matriz devuelta por el método genérico ConvertAll al método genérico Sort<T>(T[], Comparison<T>).