2009-03-23 7 views
1

filtering ('constraining') types in a foreach loop에 대한 내 질문을 참조하십시오. 컬렉션의 .Where 메서드를 사용하여 Charlie Flowers의 대답에서 첫 번째 방법을 시도하고 있지만 컴파일러에서 찾을 수 없습니다. 시스템에서 .Web.UI.ControlCollection 클래스 이것은 IEnumerable에서 파생되었으므로 여기에 어떤 문제가 있습니까?'where()'메서드의 문제

foreach (var control in Controls.Where(i => i.GetType() == typeof(TextBox))) 

답변

4

먼저 파일 상단에 using System.Linq;이 있는지 확인하십시오.

foreach (var control in Controls.Cast<Control>() 
     .Where(i => i.GetType() == typeof(TextBox))) {...} 

: 당신이 IEnumerable하지만 IEnumerable<T>를 구현하는 컬렉션이 있지만 개체를 ​​알고 있다면

지정된 유형 (예 : Control)의 모두, 당신은 Cast<T> LINQ 확장 방법을 사용할 수 있습니다 (아무것도 잘못되면 Cast<T>가 예외를 throw) 그러나 귀하의 Where 절 주어, 좀 더 신중한 수 있습니다,이 경우, 특정 유형의 사람들을 반환 OfType<T> 방법을 사용합니다 :

foreach (var control in Controls.OfType<TextBox>()) {...} 

이 버전과 약간 다른 점은 위의 경우 GetType() == typeof(TextBox) 버전의 경우와 같이 TextBox의 하위 클래스가 반환된다는 것입니다.

는 기본적으로 LINQ 확장 방법의 대부분은 IEnumerable<T>/ IQueryable<T>하지 IEnumerable/ IQueryable 만 정의된다.

+0

감사합니다. 실제로 OfType에서 구별하기 위해 예제에서 'where'를 사용하여 찾고자하는 모든 유형이 아닌 정확한 유형 만 얻으려고했습니다. 캐스트는 입니다. – ProfK