2015-06-28 2 views
-2

Может ли кто-нибудь помочь мне, как именно работает этот код. Как IEnumarable сохраняется в памяти Что именно var делает в этом контексте? почему они использовали CONCAT в этом коде, что именно он конкатенацииРабота IEnumarable in для управления циклом

public IEnumerable<Control> GetAll(Control control,Type type) 
{ 
    var controls = control.Controls.Cast<Control>(); 
    return controls.SelectMany(ctrl => GetAll(ctrl,type)).Concat(controls) 
                 .Where(c => c.GetType() == type); 
} 

ответ

0

IEnumerable является интерфейсом. Когда тип реализует IEnumerable, выдает перечислитель, который может использоваться для итерации через элементы типов.

Например, массив реализует этот интерфейс. Следовательно, вы можете обходить это предметы, используя foreach заявление:

foreach(var item in array) 
{ 
    // ... 
} 

Этот метод, GetAll возвращает последовательность Control объектов. Это может быть массив из Control объектов, список Control объектов или любого типа, который реализует IEnumerable<Control>. Этот метод получает в качестве параметров два объекта: один из Control, а другой тип Type. Затем в переменной с именем controls вы храните коллекцию элементов управления, содержащихся в элементе управления. Для получения дополнительной информации об этом, пожалуйста, посмотрите here. После этого здесь:

return controls.SelectMany(ctrl => GetAll(ctrl,type)) 
       .Concat(controls) 
       .Where(c => c.GetType() == type); 

управление Еогеаспом в контрольной группе вы получите это содержащиеся элементы управления одновременно рекурсивно. И затем вы присоединяетесь к двум последовательностям с помощью controls, и вы возвращаете их.

В нескольких словах, если вы передадите туда элемент управления, тип которого является кнопкой, тогда метод GetAll вернет вам последовательность всех кнопок, которые содержатся в одной и той же панели.

0

Вы можете просто использовать:

control.Controls.OfType<type>(); 

Если вы хотите немедленных дочерних элементов управления в управления типа которых является типа

+1

Это возвращает только первый уровень глубоко, в то время как его код извлекает все элементы управления. –

+0

@RobertMcKee Да, вы правы – Ormoz

Смежные вопросы