2012-07-27 8 views
10

Ich habe eine List<BaseClass> mit Mitgliedern darin. Ich möchte die Liste (und alle ihre Mitglieder speziell) auf einen Typ List<ChildClass> umwandeln, wobei ChildClassBaseClass erbt. Ich weiß, ich kann das gleiche Ergebnis durch eine foreach erhalten:Casting Bestückte Liste <BaseClass> zu Liste <ChildClass>

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

Aber gibt es eine sauberere Art und Weise, dies zu tun? Hinweis - Dies geschieht auf der WP7-Plattform.

Antwort

18

Sie können dies tun, wenn Sie wirklich sicher sind, alle Einzelteile sind gießbare:

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

Ihre aktuellen Code fügt null wenn ein Baseclass Artikel ist nicht zu Child gegossen werden kann. Wenn das wirklich Ihre Absicht, wäre dies gleichbedeutend:

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

Aber ich würde vielmehr dies vorschlagen, die Typprüfung umfasst und Einzelteile überspringen, die nicht übereinstimmen:

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

Versuchen Sie Botz's Art ... –

+0

Danke - in diesem Fall bin ich sicher, dass jedes Element vom angegebenen Typ ist. Ich habe meine Modelle in "dumme" (nur Eigenschaften) und "intelligente" (alle Funktionen) Versionen aufgeteilt, wobei die intelligenten Klassen das "dumme" erben. Das erste Beispiel hier funktioniert genauso wie es sollte - danke für die Hilfe! Das gilt auch für dich @Adam Houldsworth –

3

Die folgende ist fast entsprechen Ihren aktuellen Code (die einzige fehlende Sache ist es nicht hinzufügen nulls für gescheiterte Abgüsse):

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

Dies wird Igno re Instanzen, in denen die Liste eine andere abgeleitete Klasse als ChildClass enthält.

Sie können auch verwenden:

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

Aber das wird ein InvalidCastException auf die Dinge werfen sie nicht werfen kann.

Verwandte Themen