2012-03-05 12 views
0

私のコンテナオブジェクトには、List<AbstractBaseClass>という専用オブジェクトと、AbstractBaseClassから派生したいくつかの具象タイプの公開リストが含まれています。オブジェクトは、Add(AbstractBaseClass ABC)メソッドを介してAbstractBaseClassを参照することによってコンテナクラスに追加されます。抽象的な参照のリストから具体的なオブジェクトのリストを生成

パブリックリストが要求

public List<ConcreteClass> ConcreteList 
{ 
    get 
    { 
     return 
      from a in _abc 
      Where a is ConcreteClass 
      select(a as ConcreteClass) 
    } 
} 

にLINQクエリから生成されているが、これは許容可能な方法か?オブジェクトはここで2回ConcreteClassにキャストされていて、非効率的です。

+0

[「Is Is As Is Is Is Is Is Is?]」(http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is-) as-is.aspx) –

答えて

4

BCLが既に提供しているホイールを改革しています。指定された具体的な種類の項目の混合リストをフィルタリングするにはOfType<T>を使用してください。

public IEnumerable<ConcreteClass> ConcreteList 
{ 
    get 
    { 
     foreach (a in _abc) 
     { 
      ConcreteClass c = a as ConcreteClass; 
      if (c != null) 
      yield return c; 
     } 
    } 
} 

はあなたがダブルキャストを回避し、私は呼び出し元が返されていることを考えるないように、リストよりも、代わりのIEnumerableを返すために優れていると思う:

var concretes = _abc.OfType<ConcreteClass>().ToList(); 
+0

お返事ありがとうございます –

+0

この回答は直接の問題を解決します。しかし、より具体的な型へのキャストは、しばしばコードの匂いです。 – FMM

0

私がお勧めしたいです値を変更することができます。

関連する問題