如何处理包含 "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 每个项目都带有某种数据对象。