Как работать с числовым списком, содержащим "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