2009-06-03 14 views
5

Wenn Hund von Animal geerbt wird.Die beste Methode zum Umwandeln von Animal [] in Hund []

Und ich habe ein Tier [], das ich zufällig kenne, enthält nur Hunde. Was ist der schnellste/beste Weg, um einen Hund [] zu bekommen? Ich habe eine neue ArrayList (oldarray) verwendet. ToArray (typeof (Dog)); so weit, aber das fühlt sich etwas plump an und ich frage mich, ob es etwas eleganteres gibt.

UPDATE: Verwenden des .net 2.0-Profils. Sollte das natürlich sofort erwähnt haben. Ich hoffe, dass die Bearbeitung der ursprünglichen Frage in diesem Fall der Stackoverflow-Netiquette entspricht. Ich freue mich auf den Tag, an dem wir Linq aktualisieren und verwenden können.

Bye, Lucas

+0

Bearbeitung Fragen ist kein Problem; Dafür ist die Funktion gedacht. – Cheeso

Antwort

11
var dog_arr = Array.Convert(animal_arr, x => (Dog) x); 
+0

Ich musste Array.ConvertAll verwenden. Ansonsten mag ich die Eleganz dieser Lösung. – Daver

+0

Sehr gut, danke. –

6

LINQ wird diese

oldarray.Cast<Dog>().ToArray(); 
+0

während das ist elegant, es ist auch sehr ineffizient IMHO –

+0

Ist Effizienz eine Meinung? Ich denke, der Compiler sollte die hier vorgestellte Ineffizienz automatisch beheben können. Ich denke auch, dass es das nicht tun wird. Selten wichtig, zum Glück. – Lodewijk

2

Vielleicht werden Sie in der Lage, es als ein Hund [] Array in erster Linie zu schaffen?

Gegeben:

interface ICage { 
    Animal[] GetAnimals(); 
} 

Wenn Sie ein Tier [] Array mit Hunden darin instanziiert, können Sie das Array nicht werfen:

class DogCage : ICage { 
    Animal[] GetAnimals() { return new Animal[] { spot, fido }; } 
} 

Wenn Sie einen Hund [] Array mit Hunden instanziiert in Es kann immer noch als Animal [] -Array zurückgegeben werden, aber Sie können das Array auch wieder an Dog [] übergeben.

class DogCage : ICage { 
    Animal[] GetAnimals() { return new Dog[] { spot, fido }; } 
} 

Jetzt wird diese Arbeit:

Dog[] dogs = (Dog[])cage.GetAnimals(); 
-3

Sie eine generische Sammlung zum Beispiel verwenden könnte Liste von System.Collections.Generic anstelle eines Arrays dann verwenden Sie die folgende:

List<Animal> animals = new List<Animal>(); 
animals.Add(new Dog()); 
List<Dog> dogs = animals.ConvertAll(delegate(Animal animal) { return (Dog)animal; }); 

Wenn Sie es wirklich in einem Array benötigt könnten Sie auch tun:

animals.ConvertAll(delegate(Animal animal) { return (Dog)animal; }).ToArray();  
Verwandte Themen