Delegati generici per la modifica di matrici ed elenchi

Questo argomento offre una panoramica dei delegati generici per conversioni, predicati di ricerca e azioni da eseguire sugli elementi di una matrice o di una raccolta.

Delegati generici per la modifica di matrici ed elenchi

Il delegato generico Action<T> rappresenta un metodo che esegue una determinata azione su un elemento del tipo specificato. È possibile creare un metodo che esegua l'azione desiderata sull'elemento, creare un'istanza del delegato Action<T> per rappresentare il metodo e quindi passare la matrice e il delegato al metodo generico statico Array.ForEach, che viene chiamato per ogni elemento della matrice.

La classe generica List<T> fornisce inoltre un metodo ForEach che usa il delegato Action<T>. Questo metodo non è generico.

Nota

Quanto indicato sopra fornisce uno spunto interessante riguardo ai metodi e ai tipi generici. Il metodo Array.ForEach deve essere statico (Shared in Visual Basic) e generico perché Array non è un tipo generico. L'unico motivo per cui è possibile specificare un tipo su cui Array.ForEach possa agire è che il metodo dispone di un elenco specifico di parametri di tipo. Al contrario, il metodo non generico List<T>.ForEach appartiene alla classe generica List<T> e pertanto usa semplicemente il parametro di tipo della rispettiva classe. La classe è fortemente tipizzata, quindi il metodo può essere un metodo di istanza.

Il delegato generico Predicate<T> rappresenta un metodo che determina se un determinato elemento soddisfa i criteri specificati. È possibile usarlo con i metodi generici statici di Array seguenti per cercare un elemento o un set di elementi: Exists, Find, FindAll, FindIndex, FindLast, FindLastIndex e TrueForAll.

Predicate<T> usa inoltre i metodi di istanza non generici corrispondenti della classe generica List<T>.

Il delegato generico Comparison<T> consente di fornire una sequenza di ordinamento per gli elementi di matrice o elenco che non hanno un ordinamento nativo, oppure di eseguire l'override dell'ordinamento nativo. Creare un metodo che esegua il confronto, creare un'istanza del delegato Comparison<T> per rappresentare il metodo e quindi passare la matrice e il delegato al metodo generico statico Array.Sort<T>(T[], Comparison<T>). La classe generica List<T> fornisce un overload del metodo di istanza corrispondente, List<T>.Sort(Comparison<T>).

Il delegato generico Converter<TInput,TOutput> consente di definire una conversione tra due tipi e di convertire una matrice o un elenco di un tipo rispettivamente in una matrice o in un elenco dell'altro. Creare un metodo che converta gli elementi dell'elenco esistente in un nuovo tipo, creare un'istanza del delegato per rappresentare il metodo e usare il metodo statico generico Array.ConvertAll per generare una matrice del nuovo tipo a partire dalla matrice originale, oppure il metodo di istanza generico List<T>.ConvertAll<TOutput>(Converter<T,TOutput>) per generare un elenco del nuovo tipo a partire dall'elenco originale.

Concatenamento di delegati

Molti dei metodi che usano i delegati restituiscono una matrice o un elenco che è possibile passare a un altro metodo. Se ad esempio si desidera selezionare alcuni elementi di una matrice, convertirli in un nuovo tipo e salvarli in una nuova matrice, è possibile passare la matrice restituita dal metodo generico FindAll al metodo generico ConvertAll. Se il nuovo tipo di elemento è privo di un ordinamento naturale, è possibile passare la matrice restituita dal metodo generico ConvertAll al metodo generico Sort<T>(T[], Comparison<T>).

Vedi anche