创建集合对象

Kai*_*Kai 6 vb.net collections

尽管场景奇怪,但这不是一个功课问题.我刚刚替换了我正在使用的真实对象来简化示例.

让我从这里开始,但不确定如何继续.我试图写一个包含集合类,而我在世界迷路IEnumeratorIEnumerable,这是我很新的(甚至没有完全肯定我是在正确的道路上).假设我有一节课:

Public Class BakedBean
    Private Shape As String
    Private Variety As String
    Private Flavour As String
    'etc
End Class
Run Code Online (Sandbox Code Playgroud)

另一个代表BakedBeans 集合的类:

Public Class TinOfBeans
    '?
End Class
Run Code Online (Sandbox Code Playgroud)

我希望能够作为一个集合Beans进入TinOfBeans类中,这样我就可以进行这样的调用,但不依赖于特定的集合类型:

Dim myTin As New TinOfBeans()
myTin.Add(New BakedBean(...))

For Each bean As BakedBean in myTin
    '...
Next

myTin(0).Flavour = "beany"
Run Code Online (Sandbox Code Playgroud)

我一直在寻找IEnumerableIEnumerator,我有这么多,到目前为止,但我越来越失去了它:

BakedBean类

Public Class BakedBean
    Private Shape As String
    Private Variety As String
    Private Flavour As String
    'etc
End Class
Run Code Online (Sandbox Code Playgroud)

BeansEnumerator类

Public Class BeansEnumerator
    Implements IEnumerator

    Private Position As Integer = -1

    Public ReadOnly Property Current As Object Implements System.Collections.IEnumerator.Current
        Get
            '???
        End Get
    End Property

    Public Function MoveNext() As Boolean Implements System.Collections.IEnumerator.MoveNext
        '???
    End Function

    Public Sub Reset() Implements System.Collections.IEnumerator.Reset
        Position = -1
    End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

TinOfBeans类

Public Class TinOfBeans
    Implements IEnumerable

    Private beansEnum As BeansEnumerator

    Public Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
            Return beansEnum
    End Function
End Class
Run Code Online (Sandbox Code Playgroud)

在这一点上,我变得非常紧张,并且不知道如何继续(或者,正如我在开始时说的,如果这是正确的方法).有什么建议?

Joe*_*orn 7

你这么做太难了..Net 已经通过使用泛型提供所需的确切类.

我希望能够......像这样打电话:

Dim myTin As New TinOfBeans()
myTin.Add(New BakedBean(...))

For Each bean As BakedBean in myTin
    '...
Next

myTin(0).Flavour = "beany"
Run Code Online (Sandbox Code Playgroud)

当然.这是如何做:

Dim myTin As New List(Of BakedBean)()
myTin.Add(New BakedBean(...))

For Each bean As BakedBean in myTin 
   '...
Next

myTin(0).Flavour = "beany"
Run Code Online (Sandbox Code Playgroud)

你的每一行都准确映射.让Generic Collections为您完成工作.

你似乎也很困惑IEnumerable,我还有一个要求可以实现:

进行调用...而不依赖于特定的集合类型

我们可以用一种技术来涵盖这两种技术.让我们定义一个接受Bean集合的方法:

Public Sub CookBeans(ByVal beans As List(Of BakedBean))
Run Code Online (Sandbox Code Playgroud)

但是,这不处理数组,迭代器或其他BakedBean集合类型.这里的答案是IEnumerable:

Public Sub CookBeans(BvVal beans As IEnumerable(Of BakedBean))
   For Each bean As BakedBean In beans
      Cook(bean)
   Next 
End Sub
Run Code Online (Sandbox Code Playgroud)

这次我包含了该方法的示例实现,以便您可以看到它的工作方式.这里要理解的重要一点是,此方法允许您调用它并传递Array,List,Iterator或任何其他BakedBean集合.

这是因为a List(Of BakedBean) (或者更确切地说,是实现)a IEnumerable(Of BakedBean).BakedBean数组和其他.Net集合也是如此.IEnumerable是所有集合的根接口.你可以在某个内存中有一个具体的List(Of BakedBean)对象,但是使用定义你的方法参数和返回类型IEnumerable(Of BakedBean),如果你决定将那个List对象更改为其他东西,那些方法仍然可以工作.

您还可以返回IEnumerable:

Public Function GetPintos(ByVal beans As IEnumerable(Of BakedBean)) As IEnumerable(Of BakedBean)
    Dim result As IEnumerable(Of BakedBean)
    result = beans.Where(Function(bean) bean.Variety = "pinto")
    Return result
End Function
Run Code Online (Sandbox Code Playgroud)

如果你需要IEnumerable成为一个列表,它很容易:

Dim beans As List(Of BakedBeans) = '... get beans from somewhere

Dim pintos As List(Of BakedBeans) = GetPintos(beans).ToList()
Cook(pintos)
Run Code Online (Sandbox Code Playgroud)