【问题标题】:How would this be done with LINQ or a func delegate?这将如何使用 LINQ 或 func 委托来完成?
【发布时间】:2012-08-07 20:01:56
【问题描述】:

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

谢谢!

【问题讨论】:

  • LINQ 在处理不同阶段的数据时很好,但是在这里,您只需执行一些操作,For Each 循环就可以了。
  • 我可以建议您将“Option Strict On”放在代码的顶部吗?能够通过Object 使用For Each 只是要求您的代码中存在错误。

标签: vb.net linq optimization performance


【解决方案1】:

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

我在 LINQ 中可以做到这一点,但它很难看。

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

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

【讨论】:

  • 谢谢杰夫,这里有一些很棒的信息! Controls.OfType,Doh。希望我以前知道。
  • 不客气!我最近也发现了它,并且有同样的感觉;)它是由 C#/.NET Little Wonders 系列博文介绍给我的:geekswithblogs.net/BlackRabbitCoder/archive/2012/06/07/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多