我目前正在使用Visual在Visual 2015中工作,我有一个类,它接受分隔字符串,可以在字符串中的位置提取/替换数据,类似于交错数组,深度可达三层。我可能会把这门课扩大到比三个层次更深的层次,但现在,我会坚持这三个层次。对于熟悉的人来说,这就像一个PICK数据结构。已经生成了在类中读取和写入数据的基类。为了空间和权宜之计,我在帮助我的问题时加入了经过修改的代码作为参考。如果需要更多的数据,我可以提供整个类。此外,如果在讨论这个问题的过程中,有问题或建议来改进我的代码,我总是愿意听取建设性的反馈意见。
全班:
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区,4,2,8-7,5,7飞,4,8 ,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
发布于 2017-06-05 18:13:50
我认为您对MVStringEnumerator有正确的认识,您最终要枚举的是字符串数组,而不是MV分隔字符串。(作为MVDBMS专家,我了解您的参考资料。)这可能相当简单。我将消除此任务的双重职责:解析分隔符和枚举。
首先,将枚举对象降至所需动态数组的最低级别:
myValue = myMVString.MV(1,4)
第二,使之可列举:
mySubValues = myValue.AsEnumerable()
最后,将mySubValues枚举为一个常见的字符串数组。因此枚举不知道原始动态数组的MV-性质。当然,可以更优雅地完成上述所有工作,并将其封装到一个返回所需枚举的单一方法中,例如:
myEnumerable = myMVString.AsEnumerable(1,4)
或者只是迭代一些类似于new MyEnumerable(myMVSTRING(1,4))
的东西。
请注意,如果您实际上是在使用MVDBMS,那么每个平台都有自己的免费类库来完成这类工作: MVSP、UO.NET、QMClient等等。因此,您可能根本不需要从头开始编写它--尽管这是一个很好的练习。
边注
如果模拟MV动态数组,代码将使用0的基索引,其中MV使用1。
发布于 2017-06-03 09:37:57
我喜欢用字典
Dim input As String = "Foo,4,7,1-2,,6|Bar,4,2,8-7,5,7|Fly,4,,8-7,5,7"
Dim dict As Dictionary(Of String, String()) = input.Split("|").Select(Function(x) x.Split(",")) _
.GroupBy(Function(x) x(0), Function(y) y.Skip(1).ToArray()) _
.ToDictionary(Function(x) x.Key, Function(y) y.FirstOrDefault())
https://stackoverflow.com/questions/44339541
复制相似问题