Delegati generici per la modifica di matrici ed elenchi
Aggiornamento: novembre 2007
In questo argomento viene fornita una panoramica dei delegati generici per conversioni, predicati di ricerca e azioni da eseguire sugli elementi di una matrice o di un insieme.
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<T>, che viene chiamato per ogni elemento della matrice.
La classe generica List<T> fornisce inoltre un metodo ForEach che utilizza 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<T> 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 possa agire Array.ForEach<T> è 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 utilizza 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 utilizzarlo con i seguenti metodi generici statici di Array per eseguire la ricerca di un elemento o di un insieme di elementi: Exists<T>, Find<T>, FindAll<T>, FindIndex, FindLast<T>, FindLastIndex e TrueForAll<T>.
Predicate<T> utilizza 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 tale metodo e quindi passare la matrice e il delegato al metodo generico statico Array.Sort<T>(array<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 utilizzare il metodo statico generico Array.ConvertAll<TInput, TOutput> per generare una matrice del nuovo tipo a partire dalla matrice originale, oppure il metodo di istanza generico List<T>.ConvertAll<TOutput> per generare un elenco del nuovo tipo a partire dall'elenco originale.
Concatenamento di delegati
Molti dei metodi che utilizzano 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<T> al metodo generico ConvertAll<TInput, TOutput>. Se il nuovo tipo di elemento è privo di un ordinamento naturale, è possibile passare la matrice restituita dal metodo generico ConvertAll<TInput, TOutput> al metodo generico Sort<T>(array<T[], Comparison<T>).
Vedere anche
Concetti
Cenni preliminari sui generics in .NET Framework
Insiemi generici in .NET Framework
Vantaggi e limitazioni di generics
Riferimenti
System.Collections.ObjectModel