giovedì 18 dicembre 2008

Operatori Cast e OfType di LINQ: usare LINQ su colllezioni non generics

Linq è nato per essere usato su collezioni che implementano IEnumerable.
Ad esempio su List

IList<int> mialista = new List<int>();

IEnumerable<int> result = mialista.Where(miovalore => miovalore==44).Select(miovalore => miovalore);



Ma come si può usare LINQ su collection di vecchio tipo? Ad esempio su una normalissima ArrayList ?
Usando l'operaatore Cast, oppure l'operatore OfType in questo modo:
poniamo di avere una ArrayList in cui inseriamo un pò di interi, ma anche una stringa.

ArrayList mialista = new ArrayList();

mialista.Add(44);

mialista.Add(55);

mialista.Add("pippo");


Ora vogliamo recuperare l'oggetto, o gli oggetti, di valore 44.
Dato che noi cerchiamo un intero, dobbiamo modificare la ArrayList in modo che diventi una IEnumerable.

Questo si ottiene usando Cast():

IEnumerable<int> listaGenerics =mialista.Cast<int>();
IEnumerable<int> result = listaGenerics.Where(miovalore => miovalore==44).Select(miovalore => miovalore);

oppure usando OfType():

IEnumerable<int> listaGenerics =mialista.OfType<int>();
IEnumerable<int> result = listaGenerics.Where(miovalore => miovalore == 44).Select(miovalore => miovalore);


La differenza è che Cast prova a castare tutti gli oggetti nella lista. Se non riesce a castare anche un solo oggetto lancia eccezione. Nel nostro caso quindi avremo un'eccezione dato che non riuscirà a castare ad intero la stringa "pippo".

Invece OfType si accontenta di castare solo gli oggetti che può castare. Gli altri vengono tralasciati e non vengono inseriti nella collection IEnumerable. Nel nostro caso la collection listaGenerics  conterrà solo i valori 44 e 55.

Nessun commento:

Lettori fissi