1

下面的代码不能用 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

谢谢!

4

1 回答 1

1

Olivier 正确地建议 LINQ 有利于通过过滤器和应用转换等处理数据......它在其他事情(如递归、多分支逻辑)方面做得不好。

我有点能够在 LINQ 中做到这一点,但它很难看。

但是,我建议您至少窃取一个 LINQ 功能...您可以使用此行轻松过滤ControlCollectionfor FlowLayoutPanel(作为奖励,它已经为您强类型化了!)

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 该集合中对象的类型(更多细节在这里)。

于 2012-08-16T12:38:28.483 回答