Как работать с числовым списком, содержащим "bis", ter" "quater"и т. Д.

Мне нужно обработать List (или Array или DataTable Field), состоящий из чисел, где иногда встречаются "bis", ter" "quater"и так далее.

Список выглядит так:

1
2
3
3 бис
4
5
5 бис
5 тер
5 кватер
6
...

Моя идея (чтобы сохранить порядок) состоит в том, чтобы хранить данные с использованием десятичных знаков таким образом:

5 бис = 5,2
5 тер = 5,3
5 кватер = 5,4

и преобразовать в строку, а затем использовать replace на извлечение данных.

Мой вопрос:
- это хороший способ?
- есть ли лучшие решения?

2 ответа

Решение

Ваш подход сломается, когда вы доберетесь до 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)Например, где вы хотите связать каждый элемент с каким-либо объектом данных.

Вы сказали, состоит из чисел, но это выглядит как строки. Таким образом, вы можете анализировать строки, предполагая, что формат всегда является целым числом с возможным пробелом и суффиксом.

Вы можете использовать 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 бис
4
5
5 бис
5 тер
5 кватер
6
1
2
3
3,2
4
5
5,2
5,3
5,4
6

Другие вопросы по тегам