Vb.net 不使用循环就可以找到控件吗?
我在Vb.net 不使用循环就可以找到控件吗?,vb.net,declare,Vb.net,Declare,我在FlowLayoutPanel中有许多具有不同文本的按钮,我希望找到具有特定字符串的按钮 我现在是这样做的: Dim str as String = 'some text For each btn as Button in FlowLayoutPanel.Controls If btn.Text = str then 'do something with btn End If Next 有可能这样做吗 Dim str as String = 'some t
FlowLayoutPanel
中有许多具有不同文本的按钮,我希望找到具有特定字符串的按钮
我现在是这样做的:
Dim str as String = 'some text
For each btn as Button in FlowLayoutPanel.Controls
If btn.Text = str then
'do something with btn
End If
Next
有可能这样做吗
Dim str as String = 'some text
Dim btn as Button = FlowLayoutPanel.Controls.Button.Text with that string
'do something with btn
您可以使用LINQ,例如
Dim btn = myFlowLayoutPanel.Controls.
OfType(Of Button)().
FirstOrDefault(Function(b) b.Text = myText)
请注意,无论所有子控件是否为按钮,该代码都将起作用,因为类型的确保忽略除按钮之外的任何内容。但是,如果您知道每个子控件都是一个按钮
,那么执行此操作将更有效:
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)
这样做更有效:
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
仅适用于可能存在零个、一个或多个匹配项的情况。其他方法在其他情况下更合适:
首先
:始终至少有一个匹配项,但可能不止一个匹配项
FirstOrDefault
:可能没有任何匹配项,也可能有多个匹配项
Single
:始终只有一个匹配项
SingleOrDefault
:可能没有匹配项,但不会有多个匹配项
如果使用或default
方法之一,则结果可能是Nothing
,并且在使用前应始终测试该结果是否Nothing
。您可以使用LINQ,例如
Dim btn = myFlowLayoutPanel.Controls.
OfType(Of Button)().
FirstOrDefault(Function(b) b.Text = myText)
请注意,无论所有子控件是否为按钮,该代码都将起作用,因为类型的确保忽略除按钮之外的任何内容。但是,如果您知道每个子控件都是一个按钮
,那么执行此操作将更有效:
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)
这样做更有效:
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
仅适用于可能存在零个、一个或多个匹配项的情况。其他方法在其他情况下更合适:
首先
:始终至少有一个匹配项,但可能不止一个匹配项
FirstOrDefault
:可能没有任何匹配项,也可能有多个匹配项
Single
:始终只有一个匹配项
SingleOrDefault
:可能没有匹配项,但不会有多个匹配项
如果您使用或default
方法之一,则结果可能是Nothing
,并且在使用该方法之前,您应该始终测试该结果是否Nothing
。回答得很好。OP提出的问题是,你如何找到一个没有循环的控件。当然,你的建议没有直接的循环,但是你的建议仍然是循环,偏离了问题。LINQ方法只是隐藏它;通过直接调用对象的GetEnumerator
方法枚举对象,或者对控制的每个使用。OfType
进行枚举。那么,我们怎样才能在没有循环的情况下得到控制呢?这是一个很好的答案。OP提出的问题是,你如何找到一个没有循环的控件。当然,你的建议没有直接的循环,但是你的建议仍然是循环,偏离了问题。LINQ方法只是隐藏它;通过直接调用对象的GetEnumerator
方法枚举对象,或者对控制的每个使用。OfType
进行枚举。那么,我们如何在没有循环的情况下获得控件呢?