2012-07-27 15 views
10

Ho un List<BaseClass> con membri in esso. Vorrei trasmettere l'elenco (e tutti i relativi membri in modo specifico) a un tipo List<ChildClass>, dove ChildClass eredita BaseClass. So che posso ottenere lo stesso risultato attraverso un foreach:Casting Elenco popolato <BaseClass> a elenco <ChildClass>

List<ChildClass> ChildClassList = new List<ChildClass>(); 
foreach(var item in BaseClassList) 
{ 
    ChildClassList.Add(item as ChildClass); 
} 

Ma c'è un modo più ordinato di fare questo? Nota: questo viene fatto sulla piattaforma WP7.

risposta

18

È possibile farlo se si è veramente che tutti gli elementi sono castable:

ChildClassList = BaseClassList.Cast<ChildClass>().ToList(); 

il codice corrente aggiunge null se un elemento BaseClass non può essere lanciato a ChildClass. Se questo era davvero la vostra intenzione, questo sarebbe equivalente:

ChildClassList = BaseClassList.Select(x => x as ChildClass).ToList(); 

ma io preferisco suggerire questo, che comprende il controllo di tipo e salta gli elementi che non corrispondono:

ChildClassList = BaseClassList.OfType<ChildClass>().ToList(); 
+0

Prova la strada di Botz ... –

+0

Grazie - in questo caso sono sicuro che ogni elemento è del tipo specificato. Ho diviso i miei modelli in versioni "stupide" (solo proprietà) e "intelligenti" (tutte le funzionalità), dove le classi intelligenti ereditano il muto. Il primo esempio qui ha funzionato proprio come dovrebbe - grazie per l'aiuto! Questo vale anche per te @Adam Houldsworth –

3

Il seguente è quasi equivalente al codice corrente (l'unica cosa che manca è che non aggiunge valori null per calchi falliti):

var childList = baseList.OfType<ChildClass>().ToList(); 

Ciò Igno casi in cui l'elenco contiene un'altra classe derivata diversa da ChildClass.

È anche possibile utilizzare:

var childList = baseList.Cast<ChildClass>().ToList(); 

Ma questo genera un InvalidCastException sulle cose che non può espressi.