首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向自定义类添加嵌套可枚举支持

向自定义类添加嵌套可枚举支持
EN

Stack Overflow用户
提问于 2017-06-03 02:01:18
回答 2查看 194关注 0票数 1

我目前正在使用Visual在Visual 2015中工作,我有一个类,它接受分隔字符串,可以在字符串中的位置提取/替换数据,类似于交错数组,深度可达三层。我可能会把这门课扩大到比三个层次更深的层次,但现在,我会坚持这三个层次。对于熟悉的人来说,这就像一个PICK数据结构。已经生成了在类中读取和写入数据的基类。为了空间和权宜之计,我在帮助我的问题时加入了经过修改的代码作为参考。如果需要更多的数据,我可以提供整个类。此外,如果在讨论这个问题的过程中,有问题或建议来改进我的代码,我总是愿意听取建设性的反馈意见。

全班:

代码语言:javascript
运行
复制
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"}等等.

对从哪里开始有什么想法吗?

更新:

我不知道如何把这本字典纳入课堂,所以我用我以前想出的东西更新了我的帖子。

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。

票数 2
EN

Stack Overflow用户

发布于 2017-06-03 09:37:57

我喜欢用字典

代码语言:javascript
运行
复制
        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())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44339541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档