如何处理包含 "bis" "ter" "quater" 等的数字列表
How to handle a numeric list containing "bis" "ter" "quater" and so on
我需要处理由数字组成的列表(或数组或数据表字段),其中有时会有 "bis" "ter" "quater" 等等。
列表如下:
1
2
3
3 bis
4
5
5 bis
5 ter
5 quater
6
...
我的想法(为了保持顺序)是以这种方式使用小数存储数据:
5 bis = 5.2
5 ter = 5.3
5 quater = 5.4
并转换为字符串,然后使用 replace
提取数据。
我的问题是:
- 这是个好方法吗?
- 有更好的解决方案吗?
你说由数字组成,但它看起来像字符串。因此,您可以解析字符串,假设格式始终是一个可能带有 space 和后缀的整数。
您可以使用 LINQ 查询字符串。 dataDecimals
保存你得到的小数。
Sub Main()
Dim dataStrings =
{"1",
"2",
"3",
"3 bis",
"4",
"5",
"5 bis",
"5 ter",
"5 quater",
"6"}
For Each ds In dataStrings
Console.WriteLine(ds)
Next
Dim dataDecimals =
dataStrings.Select(
Function(d)
Dim s = d.Split(" "c)
Dim r = Decimal.Parse(s(0))
If s.Length = 2 Then
Select Case s(1)
Case "bis"
r += 0.2
Case "ter"
r += 0.3
Case "quater"
r += 0.4
End Select
End If
Return r
End Function)
For Each dd In dataDecimals
Console.WriteLine(dd)
Next
Console.ReadLine()
End Sub
控制台输出
1
2
3
3 bis
4
5
5 bis
5 ter
5 quater
6
1
2
3
3.2
4
5
5.2
5.3
5.4
6
当您到达 decies
(即 5.10
)时,您的方法将失效。创建一个新的结构化类型可能会更好。例如
Public Structure OrderedNumber
Public Value As Integer
Public Order As Integer
End Structure
这使您可以执行以下操作:
Module Module1
Public Structure OrderedNumber
Implements IComparable(Of OrderedNumber)
Public Value As Integer
Public Order As Integer
Public Function CompareTo(ByVal other As OrderedNumber) As Integer _
Implements IComparable(Of OrderedNumber).CompareTo
If Value = other.Value Then
Return Order - other.Order
Else
Return Value - other.Value
End If
End Function
End Structure
Sub Main()
Dim OList As New List(Of OrderedNumber)
Dim n As OrderedNumber
' 5 ter - adding out of order!
n.Value = 5
n.Order = 2
OList.Add(n)
' 5
n.Order = 0
OList.Add(n)
' 5 bis
n.Order = 1
OList.Add(n)
OList.Sort()
For Each n In OList
Console.WriteLine(n.Value & ":" & n.Order)
Next
Console.ReadLine()
End Sub
End Module
输出:
5:0
5:1
5:2
您可以类似地使用 Dictionary(Of OrderedNumber, MyObject)
,例如,您希望 link 每个项目都带有某种数据对象。
我需要处理由数字组成的列表(或数组或数据表字段),其中有时会有 "bis" "ter" "quater" 等等。
列表如下:
1
2
3
3 bis
4
5
5 bis
5 ter
5 quater
6
...
我的想法(为了保持顺序)是以这种方式使用小数存储数据:
5 bis = 5.2
5 ter = 5.3
5 quater = 5.4
并转换为字符串,然后使用 replace
提取数据。
我的问题是:
- 这是个好方法吗?
- 有更好的解决方案吗?
你说由数字组成,但它看起来像字符串。因此,您可以解析字符串,假设格式始终是一个可能带有 space 和后缀的整数。
您可以使用 LINQ 查询字符串。 dataDecimals
保存你得到的小数。
Sub Main()
Dim dataStrings =
{"1",
"2",
"3",
"3 bis",
"4",
"5",
"5 bis",
"5 ter",
"5 quater",
"6"}
For Each ds In dataStrings
Console.WriteLine(ds)
Next
Dim dataDecimals =
dataStrings.Select(
Function(d)
Dim s = d.Split(" "c)
Dim r = Decimal.Parse(s(0))
If s.Length = 2 Then
Select Case s(1)
Case "bis"
r += 0.2
Case "ter"
r += 0.3
Case "quater"
r += 0.4
End Select
End If
Return r
End Function)
For Each dd In dataDecimals
Console.WriteLine(dd)
Next
Console.ReadLine()
End Sub
控制台输出
1
2
3
3 bis
4
5
5 bis
5 ter
5 quater
6
1
2
3
3.2
4
5
5.2
5.3
5.4
6
当您到达 decies
(即 5.10
)时,您的方法将失效。创建一个新的结构化类型可能会更好。例如
Public Structure OrderedNumber
Public Value As Integer
Public Order As Integer
End Structure
这使您可以执行以下操作:
Module Module1
Public Structure OrderedNumber
Implements IComparable(Of OrderedNumber)
Public Value As Integer
Public Order As Integer
Public Function CompareTo(ByVal other As OrderedNumber) As Integer _
Implements IComparable(Of OrderedNumber).CompareTo
If Value = other.Value Then
Return Order - other.Order
Else
Return Value - other.Value
End If
End Function
End Structure
Sub Main()
Dim OList As New List(Of OrderedNumber)
Dim n As OrderedNumber
' 5 ter - adding out of order!
n.Value = 5
n.Order = 2
OList.Add(n)
' 5
n.Order = 0
OList.Add(n)
' 5 bis
n.Order = 1
OList.Add(n)
OList.Sort()
For Each n In OList
Console.WriteLine(n.Value & ":" & n.Order)
Next
Console.ReadLine()
End Sub
End Module
输出:
5:0
5:1
5:2
您可以类似地使用 Dictionary(Of OrderedNumber, MyObject)
,例如,您希望 link 每个项目都带有某种数据对象。