2010-05-10 3 views

risposta

10

È possibile utilizzare LINQ con qualsiasi IEnumerable utilizzando la funzione Cast<T>() o la funzione OfType<T>(). Se sei sicuro che lo IEnumerable contenga solo oggetti di un tipo particolare, allora Cast<T>() sarà leggermente più veloce.

Per esempio,

ArrayList foo = new ArrayList(); 

foo.Add("bar"); 
foo.Add("baz"); 

var bar = foo.Cast<string>().Select(s => s.ToUpper()); 

Ci sono molte classi esistenti (come ArrayList) che esistevano prima dell'avvento dei farmaci generici in .NET, quindi sono ancora non generico.

+0

Quanto di un successo in termini di prestazioni sarà? –

+0

@Chris: molto poco con 'Cast', e solo molto leggero con' OfType' (poiché il controllo del tipo viene eseguito due volte). –

2

Queste classi spesso risalgono a prima di generici in. Molte di queste classi hanno equievelenti generici ma non tutti. Ci sono anche soluzioni alternative. per esempio. con linq qualsiasi raccolta non generica può essere fatta in linqy e generica usando i metodi di estensione .Cast() e .OfType().

+0

+1 per l'utilizzo di "linqy" –

+0

Linqy è una buona parola, ma preferisco quella coniata da un collega dopo aver aggiunto un gruppo di UpdatePanels alla sua pagina asp.net. Ha dichiarato che aveva appena "ajaxificato" la sua pagina ;-) –

2

Ricorda che molti dei tipi di BCL che utilizziamo risalgono al periodo precedente ai generici, che sono arrivati ​​in 2.0. Tuttavia, puoi ancora usare LINQ con molti di loro, devi semplicemente fare un piccolo lavoro extra.

ArrayList arrayList = new ArrayList(); 
arrayList.Add(1); 
arrayList.Add(2); 

var query = from item in arrayList.OfType<int>() select item; 
+2

Ciò * filtrerà * gli elementi in ArrayList solo quelli che sono di tipo int. –

12

La storia conta. Generics non è sempre esistito, quindi potresti incontrare classi e API progettate prima dell'avvento dei generici.

Inoltre, il pubblico di destinazione è importante. Alcune caratteristiche stanno prendendo di mira un pubblico sviluppatore che potrebbe avere problems understanding generics:

Tradeoff: API utilizzando alcune avanzate caratteristiche di Generics possono essere troppo difficile da usare per alcuni sviluppatori. Il concetto di Generics non è ampiamente compreso , in alcuni casi, la sintassi può porre dei problemi, e come qualsiasi grande nuova funzionalità, Generics può rappresentare una curva di apprendimento significativo per alcuni sviluppatori entry-level.

Sì, la citazione è del 2004, ma alcuni, se non la maggior parte dell'API .Net che utilizzi oggi è uscito nel 2005, quindi la citazione è in realtà molto pertinente.

+2

+1 Nelle precedenti discussioni con il personale MS, sono molto reticenti a fare delle modifiche alle API pubbliche (o anche alle modifiche additive alle interfacce - in quanto ciò potrebbe violare gli implementatori di interfaccia esistenti).se sei un consumatore puro, sembra un rompicoglioni, ma una volta che sei nella loro posizione (producendo API per il consumo degli altri), inizi rapidamente ad immedesimarti e segui pratiche simili in quanto ti semplifica la vita e facilita l'adozione più rapida di versioni più recenti e meglio supportate. –

Problemi correlati