使用拆分转换列表的更简单方法 (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
我真的需要一些帮助。
我有一个包含以下内容的列表(字符串):
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