2009-03-23 2 views
1

Ссылаясь на мой вопрос на filtering ('constraining') types in a foreach loop, я пытаюсь использовать первый метод в ответе Чарли Флауза, используя метод .Where в коллекции, но компилятор не может найти. Где в системе .Web.UI.ControlCollection. Это происходит от IEnumerable, так что в этом проблема?Проблема с методом 'where()'

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

ответ

4

Прежде всего, убедитесь, что у вас есть using System.Linq; в верхней части файла.

Если у вас есть коллекция, которая реализует IEnumerable но не IEnumerable<T>, но вы знаете, объекты все данного типа (например, Control), то вы можете использовать Cast<T> LINQ метод расширения:

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

Однако, учитывая ваше положение Where, это может быть более разумным, в этом случае использовать OfType<T> метод, который возвращает только те из заданного типа (Cast<T> генерирует исключение, если что-то не так):

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

Небольшая разница между этой и вашей версией заключается в том, что вышеперечисленное вернет подклассы TextBox, где, поскольку ваша версия GetType() == typeof(TextBox) не будет.

В принципе, большинство из методов расширения LINQ определены только для IEnumerable<T>/IQueryable<T>, не IEnumerable/IQueryable.

+0

Спасибо. Я действительно рассматривал использование «где» в примере, чтобы отличать от OfType, чтобы получить только точные типы, а не все присваиваемые типы. Литье хорошо работает. – ProfK