2009-06-03 7 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

あなたが最初の場所で犬[]配列として作成することができますでしょうか?

interface ICage { 
    Animal[] GetAnimals(); 
} 

あなたはそれで犬と動物[]配列をインスタンス化する場合は、配列にキャストすることはできません:あなたは犬と犬[]配列をインスタンス化した場合

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

を考えると

それは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();  
関連する問題