2009-12-31 7 views
3

가 나는이에 대한 모든 참조를 저장하는 목록을 사용하여 (예를 들어 DisplayObject2D) Object2D을 상속하는 추상 클래스 (Object2D), 여러 클래스C#을 - <T>

있어 목록 내 지정된 형태 요소를 반복 사물.

이 목록에있는 모든 DisplayObject2D를 반복하고 싶습니다.

지금까지, 다음과 같은 코드가 작동하지만, C#을 개발 새로운 것, 나는 그렇게 할 더 좋은 연습이 아니었다면 알고 싶어 :

List<Object2D> tmp = objects.FindAll(delegate(Object2D obj) 
             { return obj is DisplayObject2D; }); 
foreach(DisplayObject2D obj in tmp) 
{ 
    ... 
} 

사전에 감사!

+1

@ZedK : +1 좋은 질문 : 바로 지금 작업하고있는 것과 관련이 있습니다. foreach 루프에서 George의 답을 직접 사용할 수 있다는 것을 알고 있다고 확신하지만, 다음과 같이 언급 할 것입니다. foreach (objects.OfType의 Object2D obj ()) {...} : of 물론 'tmp'에 필터링 된 객체를 보존해야하는 다른 이유가있을 수 있으므로 Type을 기준으로 필터링 한 결과를 "실행하고 잊어 버리기"를 원하지 않을 수 있습니다. – BillW

+0

네, 그저 방금 한 것입니다 (누락 된 "using System.Linq"문을 추가 한 후), 모든 것이 한 줄로 완료되어 완벽합니다. 감사! –

답변

13
var objects2d = objects.OfType<DisplayObject2D>(); 

당신이 목록을 OfType 당신에게 더 특정 유형의

IEnumerable<DisplayObject2D> 

을 줄 것이다

주를 원한다면 당신이 아니라면 당신은 IEnumerable을

var listOfObjects2d = objects2d.ToList(); 

를 원하는 경우 Cast 확장 프로그램을 사용하여 기본 유형의 열거 형으로 다시 캐스트 할 수 있습니다.

var listOfObjects2dFilteredByMoreSpecificType = 
objects.OfType<DisplayObject2D>.Cast<Object2D>() 
//.ToList() // until you really need an IList<T> better leave it just an enumerable 
; 
+1

@ George +1, 감사합니다. 당신의 대답은 제가 OfType을 사용하면서 겪었던 문제를 해결했습니다 ... 나는 마지막에 빈 괄호를 생략하고있었습니다. – BillW

+0

실제로 "objects"는 List 이고 OfType 메서드가 존재하지 않습니다 (자동 완성 창에 나타나지 않는 것 같습니다) =/ MSDN에서 "OfType"을 찾고 있었지만 그것을 사용하는 방법을 정말로 이해하지 못했습니다. –

+3

이를 사용하려면 System.Linq 네임 스페이스와 System.Core dll에 대한 참조를 사용해야합니다. –