Delegados genéricos para manipulação de matrizes e listas

Este tópico fornece uma visão geral de delegados genéricos para conversões, predicados de pesquisa e ações a serem tomadas nos elementos de uma matriz ou coleção.

Delegados genéricos para manipulação de matrizes e listas

O delegado Action<T> genérico representa um método que executa uma ação em um elemento do tipo especificado. Você pode criar um método que executa a ação desejada no elemento, criar uma instância do delegado Action<T> para representar esse método e, em seguida, passar a matriz e o delegado para o método Array.ForEach genérico estático. O método é chamado para cada elemento da matriz.

A classe genérica List<T> também fornece um método ForEach que usa o delegado Action<T>. Este método não é genérico.

Observação

Isso é um argumento interessante sobre tipos e métodos genéricos. O método Array.ForEach deve ser estático (Shared no Visual Basic) e genérico porque Array não é um tipo genérico; o único motivo pelo qual você pode especificar um tipo em que o Array.ForEach deve operar é que o método tenha sua própria lista de parâmetros de tipo. Por outro lado, o método List<T>.ForEach não genérico pertence à classe genérica List<T>; portanto, ele simplesmente usa o parâmetro de tipo de sua classe. A classe é fortemente tipada; portanto, o método pode ser um método de instância.

O delegado Predicate<T> genérico representa um método que determina se um determinado elemento atende aos critérios que você definir. Você pode usá-lo com os seguintes métodos genéricos estáticos de Array para procurar um elemento ou um conjunto de elementos: Exists, Find, FindAll, FindIndex, FindLast, FindLastIndex e TrueForAll.

O Predicate<T> também funciona com os métodos de instância não genérica correspondentes da classe genérica List<T>.

O delegado Comparison<T> genérico permite que você forneça uma ordem de classificação para elementos de matriz ou lista que não têm uma ordem de classificação nativa, ou para substituir a ordem de classificação nativa. Crie um método que executa a comparação, crie uma instância do delegado Comparison<T> para representar o método e, em seguida, passe a matriz e o delegado para o método Array.Sort<T>(T[], Comparison<T>) genérico estático. A classe List<T> genérica fornece uma sobrecarga do método de instância correspondente, List<T>.Sort(Comparison<T>).

O delegado Converter<TInput,TOutput> genérico permite que você defina uma conversão entre dois tipos e para converter uma matriz de um tipo em uma matriz do outro ou para converter uma lista de um tipo em uma lista do outro. Crie um método que converte os elementos de uma lista existente para um novo tipo, crie uma instância delegada para representar o método e usar o método Array.ConvertAll estático genérico para produzir uma matriz do novo tipo da matriz original, ou o método de instância List<T>.ConvertAll<TOutput>(Converter<T,TOutput>) genérico para produzir uma lista do novo tipo da lista original.

Encadeando delegados

Muitos dos métodos que usam esses delegados retornam uma matriz ou lista, que pode ser passada para outro método. Por exemplo, se você quiser selecionar determinados elementos de uma matriz, converta esses elementos em um novo tipo e salve-os em uma nova matriz, você pode passar a matriz retornada pelo método FindAll genérico para o método ConvertAll genérico. Se o novo tipo de elemento não tiver uma ordem de classificação natural, você poderá passar a matriz retornada pelo método ConvertAll genérico para o método Sort<T>(T[], Comparison<T>) genérico.

Confira também