2009-06-03 2 views
5

개가 동물에게서 유래하는 경우.동물 []에서 개 []로 캐스팅하는 가장 좋은 방법

그리고 나는 동물 []이 있는데, 내가 알고있는 일은 개만 들어 있습니다. 개 []에 손을 대는 가장 빠르고/가장 좋은 방법은 무엇입니까? 나는 새로운 ArrayList (oldarray)를 사용했다. ToArray (typeof (Dog)); 지금까지는,하지만 조금 어색한 느낌이 들었고, 좀 더 우아한 것이 있는지 궁금합니다.

업데이트 : .net 2.0 프로필을 사용하십시오. offcourse가 이것을 즉시 언급해야합니다. 나는 원래의 질문을 편집 stackoverflow 네티켓이 경우에 준수 바랍니다. Linq를 업그레이드하고 사용할 수있는 날을 고대하고 있습니다.

안녕

, 루카스

+0

편집 질문에 아무 문제가 없다; 그것이 특징입니다. – Cheeso

답변

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

Array.ConvertAll을 사용해야했습니다. 그 외에도이 솔루션의 우아함을 정말 좋아합니다. – Daver

+0

아주 좋습니다. 고마워요. –

6

LINQ를 사용하여이 아마도

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

이것은 우아하면서도 비효율적입니다. IMHO –

+0

효율성에 대한 의견이 있습니까? 나는 컴파일러가 여기 제시된 비효율을 자동으로 수정할 수 있어야한다고 생각한다. 나는 또한 그렇게하지 않을 것이라고 생각합니다. 드물게 운이 좋게 중요합니다. – Lodewijk

2

첫 번째 장소에서 개 [] 배열로 만들 수있을 것인가?

감안할 때 : 당신이 개를 가진 개 [] 배열을 인스턴스화하는 경우

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

: 당신이 그것에 개를 가진 동물 [] 배열을 인스턴스화하는 경우

interface ICage { 
    Animal[] GetAnimals(); 
} 

, 당신은 배열을 캐스팅 할 수 없습니다 그것은 여전히 ​​Animal [] 배열로 반환 될 수 있지만 배열을 다시 Dog []로 캐스트 할 수도 있습니다.

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

지금이 작동합니다 :

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

당신은 일반적인 수집을 예를 들어, 사용할 수 있습니다 대신 배열의 System.Collections.Generic에서 목록은 다음 사용 : 당신이 정말로 배열을 필요한 경우

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

당신도 할 수 :

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