我在一个列表(称为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)
类重载了接受Comparison(Of T)
委托的Sort
方法。我建议你用这个。它允许您编写一个方法或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)
请注意,这是相当低效的,因为它在每次比较时都会拆分两个项目。对于一个小列表来说,这不是什么大不了的事,但如果有很多项目,最好将每个项目拆分一次,然后根据这些结果进行排序。