2012-03-05 4 views
0

내 컨테이너 개체에는 List<AbstractBaseClass> 개인 및 AbstractBaseClass에서 파생 된 여러 가지 구체적인 유형의 공개 목록이 포함되어 있습니다. 객체는 Add(AbstractBaseClass ABC) 메소드를 통해 AbstractBaseClass를 참조하여 컨테이너 클래스에 추가됩니다.추상 참조 목록에서 구체적인 개체 목록을 생성합니다

공개리스트 요청에 LINQ 쿼리로부터 생성

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

이 허용 방법? 오브젝트가 ConcreteClass에 두 번 캐스트되고 비효율적입니까?

+0

[[Is Is Is 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

나는 좋을 것 값을 수정할 수 있습니다.

관련 문제