Вы можете использовать LINQ, например.
Dim btn = myFlowLayoutPanel.Controls.
OfType(Of Button)().
FirstOrDefault(Function(b) b.Text = myText)
Обратите внимание, что этот код будет работать, все ли дочерние элементы управления являются Buttons
или нет, так как OfType
гарантирует, что ничего, кроме Button
игнорируется. Если вы знаете, что каждый дочерний элемент управления является Button
, хотя, это было бы более эффективным, чтобы сделать это:
Dim btn = myFlowLayoutPanel.Controls.
Cast(Of Button)().
FirstOrDefault(Function(b) b.Text = myText)
и эффективнее еще сделать это:
Dim btn = DirectCast(myFlowLayoutPanel.Controls.
FirstOrDefault(Function(b) b.Text = myText),
Button)
Разница будет незначительным, хотя и , если эффективность является вашей главной задачей, то вы, вероятно, не должны использовать LINQ вообще.
Также обратите внимание, что FirstOrDefault
подходит только в том случае, если может быть ноль, одно или несколько совпадений. Другие методы более подходят в других случаях:
First
: Всегда будет по крайней мере одно совпадение, но может быть более одного.
FirstOrDefault
: Возможно, не найдено совпадений, и может быть более одного.
Single
: Всегда будет ровно одно совпадение.
SingleOrDefault
: Не может быть совпадений, но никогда не будет более одного.
Если вы используете один из методов OrDefault
, тогда результат может быть Nothing
, и вы должны ВСЕГДА проверить этот результат для Nothing
перед его использованием.
Отличный ответ, предлагающий LINQ. Как «вы находите элемент управления без цикла», это вопрос, заданный OP. Конечно, ваше предложение не имеет прямой цикл 'For', но ваши предложения все еще повторяются и отклоняются от вопроса. Методы LINQ просто скрывают это; объект перечисляется либо путем вызова его метода «GetEnumerator» напрямую, либо с помощью «Для каждого», в котором «Controls.OfType» делает. Итак, как мы можем получить элементы управления без цикла? – Codexer