В настоящее время я работаю в Visual Studio 2015 с использованием Visual Basic, и у меня есть класс, который принимает строку с разделителями и может извлекать/заменять данные в позициях внутри строки, подобно зубчатому массиву, до трех уровней в глубину. Я могу расширить класс, чтобы работать с более глубокими уровнями, чем три, но пока я буду придерживаться трех. Это точно так же, как структура данных PICK mvdbms для тех, кто знаком. Базовый класс для чтения и записи данных внутри класса уже создан. Для экономии места и целесообразности я включил отредактированный код в качестве справочного материала, помогающего ответить на мой вопрос. Если нужно больше данных, я могу предоставить весь класс. Также, если в ходе обсуждения этого вопроса возникнут замечания или предложения по улучшению моего кода, я всегда готов выслушать конструктивные отзывы.
Класс:
Public Class MVString
#Region " Properties "
Private Record As String
Default WriteOnly Property MV(ByVal str As String) As MVString
Set
Record = str
End Set
End Property
Default Public Property MV(ByVal AMPos As Integer) As MVString
'Get and set value at top level
End Property
Default Public Property MV(ByVal AMPos As Integer, ByVal VMPos As Integer) As MVString
'Get and set value at middle level
End Property
Default Public Property MV(ByVal AMPos As Integer, ByVal VMPos As Integer, ByVal SMPos As Integer) As MVString
'Get and set value at deepest level
End Property
#End Region
#Region " Constructors "
Public Sub New()
Record = ""
End Sub
Public Sub New(ByVal str As String)
Record = str
End Sub
#End Region
#Region " Methods "
Public Sub Clear()
Record = ""
End Sub
Public Overrides Function ToString() As String
Return Record
End Function
#End Region
#Region " Operators "
Public Shared Widening Operator CType(v As String) As MVString
Return New MVString(v)
End Operator
Public Shared Widening Operator CType(v As MVString) As String
Return v.ToString
End Operator
#End Region
End Class
Мой вопрос заключается в следующем: как мне создать перечисляемую поддержку для этого класса и ограничить ее тремя уровнями, чтобы система знала, на каком уровне она находится и какой разделитель ей нужно использовать? Например, если у меня есть следующая переменная:
Dim DelimitedString As String = "Foo,4,7,1-2,,6|Bar,4,2,8-7,5,7|Fly,4,,8-7,5,7"
Разделителем для верхнего уровня будет "|", для второго уровня будет ",", а для самого глубокого уровня будет "-". В этом случае верхний уровень будет массивом {"Foo,4,7,1-2,,6", "Bar,4,2,8-7,5,7", "Fly,4,,8 -7,5,7"}, второй уровень будет сначала перечислять первый элемент на верхнем уровне и возвращать {"Foo", "4", "7", "1-2", "", "6 "}, и т.д...
Есть идеи, с чего начать?
Обновлять:
Я не знаю, как включить словарь в класс, поэтому я обновил свой пост тем, что придумал раньше.
Public Function GetEnumerator() As IEnumerator(Of String) Implements IEnumerable(Of String).GetEnumerator
Return New MVStringEnumerator(Record)
End Function
Private Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
Return Me.GetEnumerator()
End Function
Private Class MVStringEnumerator
Implements IEnumerator(Of String)
Private _ThisArray() As String
Private idx As Integer
Public ReadOnly Property Current As String Implements IEnumerator(Of String).Current
Get
Return If(idx < _ThisArray.Count, _ThisArray(idx), DirectCast(Nothing, String))
End Get
End Property
Private ReadOnly Property IEnumerator_Current As Object Implements IEnumerator.Current
Get
Return Me.Current
End Get
End Property
Public Sub New(ByVal record As String)
Select Case True
Case record.Contains("|"c)
_ThisArray = Split(record, "|"c)
Case record.Contains(","c)
_ThisArray = Split(record, ","c)
Case record.Contains("-"c)
_ThisArray = Split(record, "-"c)
End Select
idx = -1
End Sub
Public Sub Reset() Implements IEnumerator.Reset
idx = -1
End Sub
Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
idx += 1
If idx >= _ThisArray.Count Then Return False
Return True
End Function
End Class