2009-06-03 13 views
5

Si Dog hereda de Animal.La mejor manera de lanzar desde Animal [] a Perro []

Y tengo un Animal [], que sé que solo contiene perros. ¿Cuál es la forma más rápida/mejor de poner mis manos en un perro []? He usado la nueva ArrayList (oldarray) .ToArray (typeof (Dog)); hasta ahora, pero eso se siente un poco torpe, y me pregunto si hay algo más elegante.

ACTUALIZACIÓN: Uso del perfil .net 2.0. Debería haber supuesto mencionar esto de inmediato. Espero que la edición de la pregunta original se adhiere a la netiquette stackoverflow en este caso. Estoy deseando que llegue el día en que podamos actualizar y usar Linq.

Adiós, Lucas

+0

preguntas de edición no es un problema; para eso es la característica. – Cheeso

Respuesta

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

Tuve que usar Array.ConvertAll. Aparte de eso, me gusta mucho la elegancia de esta solución. – Daver

+0

Muy bien, gracias. –

6

mediante LINQ esto será

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

mientras esto es elegante, también es muy ineficiente IMHO –

+0

¿Es la eficiencia una opinión? Creo que el compilador debería poder corregir automáticamente la ineficiencia presentada aquí. También creo que no lo hará. Rara vez importa, por suerte. – Lodewijk

2

Tal vez usted es capaz de crear como un [] array perro en el primer lugar?

dado:

interface ICage { 
    Animal[] GetAnimals(); 
} 

Si usted instancia a [] variedad de animales con perros en ella, no se puede convertir la matriz:

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

Si usted instancia a [] array perro con los perros en aún puede devolverse como matriz Animal [], pero también puede devolver la matriz a Perro [].

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

Ahora bien, esto va a funcionar:

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

se puede utilizar una colección genérica, por ejemplo, Lista de System.Collections.Generic lugar de una matriz a continuación, utilice la siguiente:

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

Si realmente se necesita en una matriz también se puede hacer:

animals.ConvertAll(delegate(Animal animal) { return (Dog)animal; }).ToArray();  
Cuestiones relacionadas