Vb.net 如何使用LINQ或func委托完成此操作?

Vb.net 如何使用LINQ或func委托完成此操作?,vb.net,linq,optimization,performance,Vb.net,Linq,Optimization,Performance,下面的代码不能用LINQ/func委托完成(并且做得更好)吗?我对LINQ/func相当陌生。我正在遍历表单上的所有控件,以查找所有FlowLayoutPanel(它们嵌入在选项卡和拆分容器中),并将控件索引信息保存到应用程序设置中,以便在加载时调用。我的应用程序允许用户通过拖放重新定位其GUI/控件*注意,ServicingLayout是我自己的可序列化类,包含恢复用户偏好所需的信息 Private Sub SaveFlow(ByVal F As FlowLayoutPanel) Handle

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

谢谢大家!

Olivier正确地提出LINQ有利于通过过滤器和应用转换等方式处理数据。。。它不能很好地完成其他事情(比如递归、多分支逻辑)

我可以在林克做到这一点,但这很难看

然而,我建议至少偷一个LINQ特性。。。您可以使用此行轻松筛选
ControlCollection
中的
FlowLayoutPanel
(另外,它已经为您提供了强类型!)

不用再麻烦了。。。丑林克

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该集合中对象的类型()(

Olivier正确地指出,LINQ适合通过过滤器处理数据和应用转换等。它在其他方面(如递归、多分支逻辑)做得不太好

我可以在林克做到这一点,但这很难看

但是,我建议您至少偷取一个LINQ功能…您可以使用这一行轻松地为
FlowLayoutPanel
过滤
ControlCollection
(另外,它已经为您提供了强类型!)

不用再麻烦了……丑陋的林克

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该集合中对象的类型().

LINQ在处理不同阶段的数据时很好,但是在这里,您只需执行一些操作,对于每个循环都很好。我建议您将“Option Strict On”(选项严格开启)设置为在代码顶部?能够通过
对象
为每个
执行
,这只是要求代码中存在bug。LINQ在处理不同阶段的数据时很好,但是在这里,您只需执行一些操作,每个循环都很好。我可以建议您将“Option Strict On”(选项严格设置)设置为在代码顶部?能够通过
对象对每个
进行
只会要求代码中存在bug。谢谢Jeff,这里有一些很棒的信息!Controls.OfType,Doh。希望我以前知道。不客气!我最近也发现了它,也有同样的感觉;)它是由C#/.NET小奇迹系列博客文章介绍给我的:谢谢杰夫,这里有一些很棒的信息!Controls.OfType,Doh。希望我以前知道。不客气!我最近也发现了它,也有同样的感觉;)它是由C#/.NET小奇迹系列博客文章介绍给我的: