2013-05-09 9 views
5

たとえば、私は基底クラスEntityを持っていて、次にこれから派生した2つのサブクラスLightEntityPlayerEntityを持っています。同じ基本クラスを持ち、特定のクラスを抽出するオブジェクトのリストをループしますか?

List<Entity> Entitiesこれは、LightEntitysとPlayerEntitysを保持しています。

LightEntityをすべてEntitiesから取得します。

私が試した:

List<LightEntity> lights = new List<LightEntity>(); 
foreach (Entity ent in Entities) 
{ 
    if(ent is LightEntity) 
    { 
     lights.Add(ent); 
    } 
} 

をしかし、コンパイラはまだそれがLightEntityのリストにちょうどEntityを追加しようとするかもしれないと考えているようだとして、それはこれを好きではありません。

私はLightEntityentをキャストしようとしたが、コンパイラが、それはLightEntityEntityを変換するメソッドを持たないと言います。

+1

を表示してみましょう。 C#では、ダウンキャストは暗黙的に許可されていません。これは明示的なキャストを先に進めなければならないことを意味します。このキャストはCLRに、私の場合、ダウンキャストを行うことが安全であることを伝えます。 – Nair

答えて

12

あなたは種類によってエンティティをフィルタリングするOfTypeを使用することができます。

List<LightEntity> lights = new List<LightEntity>(); 
lights.AddRange(entities.OfType<LightEntity>()); 

あるいはさらに簡単:

List<LightEntity> lights = entities.OfType<LightEntity>().ToList(); 

追加情報

+0

Linqがこれをとてもきれいにしてくれます:) –

+0

Linqについて聞いたことがないのですか?私は暇な時にC#でしか動かない。 – MatthewMcGovern

+0

厳密に言えば、これはLinqではなくIEnumerableの拡張子 – Steve

5

だけ(LightEntity)にENTをキャスト ので

Lights.Add((LightEntity)ent); 
+0

'InvalidCastExceptionが処理されなかった - PlayerEntity型のオブジェクトをLightEntity型にキャストすることができません。 – MatthewMcGovern

+1

@MatthewMcGovern - ifステートメント内に行を挿入します。 –

+0

entがLightEntityであるかどうかをチェックしているので、それは奇妙です。 PlayerEntityはLightEntityなどから継承していますか? –

1

あなたはLINQでそれを行うことができます...

var lights = Entities.Where(e => e is LightEntity) 
         .Select(e => (LightEntity)e) 
         .ToList(); 
0

まあ、すべての最初の。なぜあなたはこれをやっているのかわかりませんが、私はあなたの問題を解決するための最良の方法ではないと確信しています。おそらく、派生したクラスは、同じ基本クラスまたは類似のものを持つべきではないでしょう。もしあなたがそれを助けたいのであれば、より大きな絵を私たちに与えるべきです。

すでに掲載されているように、キャスティングは問題の解決方法です。拡張ソリューション(Tの)

Lights.Add((LightEntity)ent); 
+0

そうですね、同じ基本クラスが本当に必要かどうか、基本的な更新機能、基本描画関数、多くのメンバー変数を共有していますEntityは多くの子エンティティを持つことができるため、関係を保存してParent-> Childから更新するために、それらをすべて1か所に保持する方法が必要でした – MatthewMcGovern

2

まあリストがすでに書き込まれているので、私はあなたに原因を伝えたかったこの昔ながらの方法

List<LightEntity> lights = new List<LightEntity>(); 
foreach (Entity ent in Entities) 
{ 
    LightEntity le = ent as LightEntity 
    if(le != null) 
    { 
     lights.Add(le); 
    } 
}