如何使用LINQ或func委托来完成?

时间:2012-08-07 20:01:56

标签: vb.net linq optimization performance

使用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

谢谢!

1 个答案:

答案 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)。