按字母排序后按子字符串整数进行细化列表排序
Refined list sorting by substring integer after alphabetical sorting
我在列表(称为 listLines)中有一些信息。下面的每一行都在一个列表(字符串)中。
1|This is just a header
3|This is just a footer
2|3456789|0000000|12312312313|BLUE|1|35.00
2|7891230|0000000|45645645655|BLUE|1|22.00
2|7891230|0000000|45645645658|RED|2|13.00
2|3456789|0000000|12312312316|RED|2|45.00
2|3456789|0000000|12312312317|YELLOW|5|-9.00
2|3456789|0000000|12312312315|ORANGE|3|15.00
2|7891230|0000000|45645645659|YELLOW|5|32.00
2|3456789|0000000|12312312314|GREEN|4|-20.00
2|7891230|0000000|45645645656|GREEN|4|39.00
2|7891230|0000000|45645645657|ORANGE|3|-18.50
我正在对列表执行 listLines.sort()
以按字母顺序对其进行排序。下面是我在 .sort()
.
之后得到的
1|This is just a header
2|3456789|0000000|12312312313|BLUE|1|35.00
2|3456789|0000000|12312312314|GREEN|4|-20.00
2|3456789|0000000|12312312315|ORANGE|3|15.00
2|3456789|0000000|12312312316|RED|2|45.00
2|3456789|0000000|12312312317|YELLOW|5|-9.00
2|7891230|0000000|45645645655|BLUE|1|22.00
2|7891230|0000000|45645645656|GREEN|4|39.00
2|7891230|0000000|45645645657|ORANGE|3|-18.50
2|7891230|0000000|45645645658|RED|2|13.00
2|7891230|0000000|45645645659|YELLOW|5|32.00
3|This is just a footer
话虽如此,我需要将此信息输出到文件中。我可以做到这一点。我仍然有问题。在上面的数据中,在您可以看到的列出的颜色(红色、蓝色、等)之后的位置 5 处有一个序列号。它就在最后一个小数类型的值之前。
我需要进一步对这个列表进行排序,使其按字母顺序排列,因为位置 2 是帐号,我想将帐号分组在一起。我只是希望它们根据序列号按顺序进行排序。
我正在查看另一个线程,试图找出如何做到这一点。我找到了一段代码,如listLines.OrderBy(Function(q) q.Substring(35)).ToArray
。我认为如果这是一个固定长度的文件,这可能会对我有所帮助,但事实并非如此。我在想我可以做一些 .split()
来获取第 5 条信息并对其进行排序,但随后它会取消字母顺序并将行混合起来,因为我不知道如何指定仍然保持字母顺序.
现在我正在输出按字母顺序排列的列表,如下所示,因此我可以用逗号和双引号对其进行格式化。
For Each listLine As String In listLines
strPosition = Split(listLine, "|")
Dim i As Integer = 1
Dim iBound As Integer = UBound(strPosition)
Do While (i <= iBound)
strOutputText = strOutputText & Chr(34) & strPosition(i) & Chr(34) & ","
i += 1
Loop
我的主要问题是如何在 .sort() 之后重新排序,然后按顺序(位置 5)获取每个帐户(位置 1)?或者更好,我怎样才能同时做这两件事?
List(Of T)
class 重载了 Sort
方法,该方法采用 Comparison(Of T)
委托。我建议你使用它。它允许您编写一个方法或 lambda 表达式,它将接受两个项目并以您想要的任何方式比较它们。在这种情况下,您可以这样做:
Dim items = New List(Of String) From {"1|This Is just a header",
"3|This Is just a footer",
"2|3456789|0000000|12312312313|BLUE|1|35.00",
"2|7891230|0000000|45645645655|BLUE|1|22.00",
"2|7891230|0000000|45645645658|RED|2|13.00",
"2|3456789|0000000|12312312316|RED|2|45.00",
"2|3456789|0000000|12312312317|YELLOW|5|-9.00",
"2|3456789|0000000|12312312315|ORANGE|3|15.00",
"2|7891230|0000000|45645645659|YELLOW|5|32.00",
"2|3456789|0000000|12312312314|GREEN|4|-20.00",
"2|7891230|0000000|45645645656|GREEN|4|39.00",
"2|7891230|0000000|45645645657|ORANGE|3|-18.50"}
items.Sort(Function(x, y)
Dim xParts = x.Split("|"c)
Dim yParts = y.Split("|"c)
'Compare by the first column first.
Dim result = xParts(0).CompareTo(yParts(0))
If result = 0 Then
'Compare by the second column next.
result = xParts(1).CompareTo(yParts(1))
End If
If result = 0 Then
'Compare by the sixth column last.
result = xParts(5).CompareTo(yParts(5))
End If
Return result
End Function)
For Each item In items
Console.WriteLine(item)
Next
如果您更喜欢命名方法,请执行以下操作:
Private Function CompareItems(x As String, y As String) As Integer
Dim xParts = x.Split("|"c)
Dim yParts = y.Split("|"c)
'Compare by the first column first.
Dim result = xParts(0).CompareTo(yParts(0))
If result = 0 Then
'Compare by the second column next.
result = xParts(1).CompareTo(yParts(1))
End If
If result = 0 Then
'Compare by the sixth column last.
result = xParts(5).CompareTo(yParts(5))
End If
Return result
End Function
还有这个:
items.Sort(AddressOf CompareItems)
请注意,这是相当低效的,因为它会在每次比较时拆分两个项目。这对于一个小列表来说不是什么大问题,但是,如果有很多项目,最好将每个项目拆分一次,然后根据这些结果进行排序。
我在列表(称为 listLines)中有一些信息。下面的每一行都在一个列表(字符串)中。
1|This is just a header
3|This is just a footer
2|3456789|0000000|12312312313|BLUE|1|35.00
2|7891230|0000000|45645645655|BLUE|1|22.00
2|7891230|0000000|45645645658|RED|2|13.00
2|3456789|0000000|12312312316|RED|2|45.00
2|3456789|0000000|12312312317|YELLOW|5|-9.00
2|3456789|0000000|12312312315|ORANGE|3|15.00
2|7891230|0000000|45645645659|YELLOW|5|32.00
2|3456789|0000000|12312312314|GREEN|4|-20.00
2|7891230|0000000|45645645656|GREEN|4|39.00
2|7891230|0000000|45645645657|ORANGE|3|-18.50
我正在对列表执行 listLines.sort()
以按字母顺序对其进行排序。下面是我在 .sort()
.
1|This is just a header
2|3456789|0000000|12312312313|BLUE|1|35.00
2|3456789|0000000|12312312314|GREEN|4|-20.00
2|3456789|0000000|12312312315|ORANGE|3|15.00
2|3456789|0000000|12312312316|RED|2|45.00
2|3456789|0000000|12312312317|YELLOW|5|-9.00
2|7891230|0000000|45645645655|BLUE|1|22.00
2|7891230|0000000|45645645656|GREEN|4|39.00
2|7891230|0000000|45645645657|ORANGE|3|-18.50
2|7891230|0000000|45645645658|RED|2|13.00
2|7891230|0000000|45645645659|YELLOW|5|32.00
3|This is just a footer
话虽如此,我需要将此信息输出到文件中。我可以做到这一点。我仍然有问题。在上面的数据中,在您可以看到的列出的颜色(红色、蓝色、等)之后的位置 5 处有一个序列号。它就在最后一个小数类型的值之前。
我需要进一步对这个列表进行排序,使其按字母顺序排列,因为位置 2 是帐号,我想将帐号分组在一起。我只是希望它们根据序列号按顺序进行排序。
我正在查看另一个线程,试图找出如何做到这一点。我找到了一段代码,如listLines.OrderBy(Function(q) q.Substring(35)).ToArray
。我认为如果这是一个固定长度的文件,这可能会对我有所帮助,但事实并非如此。我在想我可以做一些 .split()
来获取第 5 条信息并对其进行排序,但随后它会取消字母顺序并将行混合起来,因为我不知道如何指定仍然保持字母顺序.
现在我正在输出按字母顺序排列的列表,如下所示,因此我可以用逗号和双引号对其进行格式化。
For Each listLine As String In listLines
strPosition = Split(listLine, "|")
Dim i As Integer = 1
Dim iBound As Integer = UBound(strPosition)
Do While (i <= iBound)
strOutputText = strOutputText & Chr(34) & strPosition(i) & Chr(34) & ","
i += 1
Loop
我的主要问题是如何在 .sort() 之后重新排序,然后按顺序(位置 5)获取每个帐户(位置 1)?或者更好,我怎样才能同时做这两件事?
List(Of T)
class 重载了 Sort
方法,该方法采用 Comparison(Of T)
委托。我建议你使用它。它允许您编写一个方法或 lambda 表达式,它将接受两个项目并以您想要的任何方式比较它们。在这种情况下,您可以这样做:
Dim items = New List(Of String) From {"1|This Is just a header",
"3|This Is just a footer",
"2|3456789|0000000|12312312313|BLUE|1|35.00",
"2|7891230|0000000|45645645655|BLUE|1|22.00",
"2|7891230|0000000|45645645658|RED|2|13.00",
"2|3456789|0000000|12312312316|RED|2|45.00",
"2|3456789|0000000|12312312317|YELLOW|5|-9.00",
"2|3456789|0000000|12312312315|ORANGE|3|15.00",
"2|7891230|0000000|45645645659|YELLOW|5|32.00",
"2|3456789|0000000|12312312314|GREEN|4|-20.00",
"2|7891230|0000000|45645645656|GREEN|4|39.00",
"2|7891230|0000000|45645645657|ORANGE|3|-18.50"}
items.Sort(Function(x, y)
Dim xParts = x.Split("|"c)
Dim yParts = y.Split("|"c)
'Compare by the first column first.
Dim result = xParts(0).CompareTo(yParts(0))
If result = 0 Then
'Compare by the second column next.
result = xParts(1).CompareTo(yParts(1))
End If
If result = 0 Then
'Compare by the sixth column last.
result = xParts(5).CompareTo(yParts(5))
End If
Return result
End Function)
For Each item In items
Console.WriteLine(item)
Next
如果您更喜欢命名方法,请执行以下操作:
Private Function CompareItems(x As String, y As String) As Integer
Dim xParts = x.Split("|"c)
Dim yParts = y.Split("|"c)
'Compare by the first column first.
Dim result = xParts(0).CompareTo(yParts(0))
If result = 0 Then
'Compare by the second column next.
result = xParts(1).CompareTo(yParts(1))
End If
If result = 0 Then
'Compare by the sixth column last.
result = xParts(5).CompareTo(yParts(5))
End If
Return result
End Function
还有这个:
items.Sort(AddressOf CompareItems)
请注意,这是相当低效的,因为它会在每次比较时拆分两个项目。这对于一个小列表来说不是什么大问题,但是,如果有很多项目,最好将每个项目拆分一次,然后根据这些结果进行排序。