【问题标题】:Easier Way (Linq) to Convert List Using Split使用拆分更简单的方法(Linq)转换列表
【发布时间】:2021-12-30 14:12:57
【问题描述】:

我真的可以在这里得到一些帮助。

我有一个 List(Of String),其中包含以下内容:

A/A
A/B
空调
B/a
乙/乙
B/C
C/a
C/b
转/转
..等等。

我正在尝试在按第一个字母分组的 TableLayoutPanel 中创建控件,以使布局看起来像这样。

标题 A

标签a |文本框
标签 b |文本框 b
标签 c |文本框 c

标题 B

标签a |文本框
标签 b |文本框 b
标签 c |文本框 c

标题 C

标签a |文本框
标签 b |文本框 b
标签 c |文本框 c

我当前的代码对列表进行排序并创建控件:

 For Each item In _List

                    TableLayoutPanel1.Controls.Add(New Label With {
                           .Name = cc.ToString,
                           .Text = SplitContentControl(cc.ToString, ""),
                           .Height = 20,
                           .Font = New Font("Segoe UI", 12,
                    FontStyle.Bold)
                                                  })


                    TableLayoutPanel1.Controls.Add(New TextBox With {.Height = 20,
                    .Font = New Font("Segoe UI", 12,
                    FontStyle.Bold)})
 Next 

我尝试过像这样创建一个 Dictionary(Of String, String):

Dim dict As Dictionary(Of String, String) = ccs.ToDictionary(Function(x) x.split("/")(0), Function(y) y.split("/")(1))

但当然不能这样做,因为这会产生重复。

我还尝试使用 Split("/") 和 Lambda 表达式创建一个新的 List(Of ControlID),其中 ControlID 是类

Public Class ControlID
 Public ControlHead as String
 Public ControlName as String
End Class

但无论我尝试什么,我似乎都无法让 Lambda 为我工作。

如果有人有解决方案,请提供帮助。我将不胜感激。

【问题讨论】:

    标签: vb.net linq lambda


    【解决方案1】:

    也许这会给你一些想法......

    Private Sub Test()
        Dim l As List(Of String)
        'some data
        l = (From s In {"B", "A", "C"}
                From sm In {"c", "b", "a"}
                Select s & "/" & sm).ToList
    
        Dim ctrlGRPS
    
        ctrlGRPS = From s In l
                     Let c = New ControlID(s)
                     Select c Order By c.ControlName Order By c.ControlHead
                     Group By h = c.ControlHead
                     Into HeadGrp = Group
    
        For Each head In ctrlGRPS
            For Each ctrl In head.HeadGrp
                Stop 'look at ctrl
            Next
        Next
    End Sub
    
    Public Class ControlID
        Public ControlHead As String
        Public ControlName As String
        Public Sub New(s As String)
            Dim p() As String = s.Split("/"c)
            Me.ControlHead = p(0)
            Me.ControlName = p(1)
        End Sub
    End Class
    

    【讨论】:

      【解决方案2】:

      除非我误解了你的问题,否则以下应该有效:

      Dim controlIds As IEnumerable(Of ControlID) = ccs
          .Select(Function(x) New ControlID With { .ControlHead = x.split("/")(0), .ControlName = x.split("/")(1) })
      

      但是,如果您创建了一个创建 ControlID 对象的方法,则更易于阅读,如下所示:

      Private Function ParseControlId(value As String) As ControlID
          Dim parts() As String = value.Split("/")
          Return New ControlID With { .ControlHead = parts(0), .ControlName = parts(1) }
      End Function
      

      然后,在您的 LINQ 中,您可以引用该函数而不是 lambda:

      Dim controlIds As IEnumerable(Of ControlID) = ccs.Select(AddressOf ParseControlID)
      

      【讨论】:

      • 辉煌的史蒂文,谢谢你这完美的工作。
      猜你喜欢
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多