使用LINQ / func委托无法完成以下代码(并且做得更好)?我对LINQ / func很新。我循环遍历表单上的所有控件以查找所有FlowLayoutPanel(它们嵌入在选项卡和拆分容器中)并将控制索引信息保存到应用程序设置,以便在加载时可以调用它。我的应用程序允许用户通过拖放重新定位他们的GUI /控件。 *注意,ServicingLayout
是我自己的可序列化类,我需要恢复用户偏好的信息。
Private Sub SaveFlow(ByVal F As FlowLayoutPanel) Handles Me.FoundFlow
For Each C As Control In F.Controls
My.Settings.ServicingLayout.AddControl(F.Name, C.Name, F.Controls.GetChildIndex(C))
Next
End Sub
Private Event FoundFlow(ByVal F As FlowLayoutPanel)
Private Sub SaveFlowLayouts(ByVal CC As Object)
For Each C As Control In CC
If TypeOf C Is FlowLayoutPanel Then RaiseEvent FoundFlow(C)
If C.Controls.Count > 0 Then SaveFlowLayouts(C.Controls)
Next
End Sub
谢谢!
答案 0 :(得分:1)
Olivier建议LINQ适用于通过过滤器处理数据和应用转换等,这是正确的......它不会做其他事情(如递归,多分支逻辑)。
我有能力在LINQ中做到这一点,但它很难看。
但是,我建议至少窃取一个LINQ功能......您可以使用此行轻松过滤ControlCollection
FlowLayoutPanel
(作为奖励,它已经为您强力输入了!)< / p>
Dim flowLayoutPanels = Me.Controls.OfType(Of FlowLayoutPanel)
没有进一步的......丑陋的LINQ。
Private Sub SaveWithLinq(ByVal CC As Control.ControlCollection)
CC.OfType(Of FlowLayoutPanel).ToList.ForEach(
Sub(f)
f.Controls.Cast(Of Control).ToList.ForEach(
Sub(c)
My.Settings.ServicingLayout.AddControl(f.Name, c.Name,
f.Controls.GetChildIndex(c))
End Sub)
If f.Controls.Count > 0 Then
SaveWithLinq(f.Controls)
End If
End Sub)
End Sub
部分丑陋是由于Control.ControlCollection没有强类型(它实现IEnumerable
而不是IEnumerable(Of T)
,所以我们必须告诉LINQ该集合中对象的类型(more detail here)。