2013-07-24 2 views
0

다른 유형의 객체를 포함하는 추상 객체 List<>이 있습니다. 나는 특정 유형의 모든 항목을 잡고 그들 아이템을 자신의 List<>으로 설정하려고합니다.추상적 유형 목록에서 특정 유형의 모든 항목 가져 오기

이 작동하지 않습니다 -

//myAbstractItems is a List<myAbstractItem> 
//typeAList inherents from myAbstractItem 


var typeAList = ((List<itemTypeA>)myAbstractItems.Where(i => i.GetType() == typeof(itemTypeA)).ToList()); 

주조 (List<itemTypeA>)는 실패한 것으로 보인다.

+0

'itemTypeA' _ 또는 파생 된 _ _ 유형의 요소를 얻거나'itemTypeA' _exactly_의 요소를 가져 오는 것이 중요합니까? –

답변

5

사용 OfType extension method : 문서에서

var typeAList = myAbstractItems.OfType<itemTypeA>().ToList(); 

을 ...

OfType (IEnumerable) 메서드는 소스에있는 요소 만 반환하고 TResult 유형으로 캐스팅 할 수 있습니다.

+0

BACON! 감사! –

+0

완전성을 위해이 솔루션은 다음과 같은 (좋은) 속성을가집니다. ** (1) ** 'itemTypeA'의 _derived_ 유형의 요소도 새 목록에 포함됩니다. (여기서'itemTypeA'는'class' 타입으로 알려져 있습니다. 일반적인 인터페이스 타입, 일반 델리게이트 타입, 또는 배열 타입, 공동 및/또는 반항성이 고려 될 것입니다.) ** (2) ** 'null' 엔트리는 런타임 타입이 없기 때문에 새로운리스트에 포함되지 않습니다. –

0

Where 이런 식으로 사용해보십시오 :

var typeAList = myAbstractItems.Where(i => i.GetType() == typeof(itemTypeA)).Select(item => item as itemTypeA).ToList()) 
+0

마지막 '선택'대신에'.Cast ()'을 할 수 있습니다. –

0

좋은 오래된 루프가 괜찮을 것 :

List<itemTypeA> res = new List<itemTypeA>(); 
foreach(var item in myAbstractItems) 
{ 
    itemTypeA temp = item as itemTypeA; 
    if (temp != null) 
    res.Add(temp) 
} 
+1

원래의 (시도한) 코드와 약간 다른 점은 * exact * 타입의 것만이 아니라'itemTypeA'로 할당 할 수있는 모든 것을 반환한다는 것입니다. – Rawling

+0

맞습니다. 그러나 질문과 코드 및 질문이 모호합니다. ^^ –

+0

예, 사과드립니다. OP *가 원하는 버전이 될 수 있다고 제 의견에 추가하려고합니다. : p – Rawling

0

모든 itemTypeA (및 더 많은 파생 된 유형)에서 작동합니다.

var typeAList = myAbstractItems.Select(i => i as itemTypeA).Where(i => i != null).ToList(); 

편집 : 롤링의 코멘트에 따라 편집.

+1

왜'Where' 앞에'Select'를 넣고'as' 캐스트를 두 번하지 않습니까? – Rawling

0

당신이 할 수있는 또 다른 방법은 OfType을 사용하고() 메소드 :

var typeAList = myAbstractItems.OfType<itemTypeA>().ToList(); 

이 방법은 기본적으로 다음과 같은 작업을 수행합니다

var typeAList = myAbstractItems.Where(i=>i is itemTypeA).Select(i=>i as itemTypeA).ToList(); 

이 어떤 요소 않으면 오류가 발생 함을 명심를 소스 컬렉션의 null 참조입니다.

+0

마지막 예제는 원래의 포스터가 말하는 'List '이 아닌'List '을 제공합니다.하지만 'null'항목에 어떤 일이 일어나는지 기억하는 것은 흥미 롭습니다. –

+0

수정 됨. 그 점을 지적 해 주셔서 감사합니다. – KeithS

관련 문제