使用拆分转换列表的更简单方法 (Linq)

Easier Way (Linq) to Convert List Using Split

我真的需要一些帮助。

我有一个包含以下内容的列表(字符串):

A/a
A/b
A/c
B/a
B/b
B/c
C/a
C/b
C/c
..ETC。

我正在尝试在按第一个字母分组的 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 

我试过像这样创建字典(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 是 Class

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

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

如果有人有解决办法请帮忙。我将不胜感激。

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

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)

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

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