创建集合对象

时间:2013-10-29 11:28:34

标签: vb.net collections

  

尽管情节奇怪,但这不是一个家庭作业问题。我刚刚替换了我正在使用的真实对象来简化示例。

This让我从这里开始,但不确定如何继续。我正在尝试写一个包含集合的类,我迷失在IEnumeratorIEnumerable的世界里,我很新鲜(甚至不完全确定我' m在正确的道路上)。假设我有一个班级:

Public Class BakedBean
    Private Shape As String
    Private Variety As String
    Private Flavour As String
    'etc
End Class

另一个代表BakedBean s集合的类:

Public Class TinOfBeans
    '?
End Class

我希望能够在Beans类中将TinOfBeans作为集合,这样我就可以进行这样的调用,但不会绑定到特定的集合类型:

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

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

myTin(0).Flavour = "beany"

我一直在关注IEnumerableIEnumerator,到目前为止我已经有了这么多,但我已经非常迷失了它:

BakedBean Class

Public Class BakedBean
    Private Shape As String
    Private Variety As String
    Private Flavour As String
    'etc
End Class

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

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

此时我已经陷入困境并且不知道如何继续(或者,正如我在开始时说的,如果这是正确的方法)。有什么建议吗?

2 个答案:

答案 0 :(得分:7)

你这么做太难了。通过使用泛型,.Net 已经提供了完全所需的类。

  

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

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

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

myTin(0).Flavour = "beany"

不确定。方法如下:

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

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

myTin(0).Flavour = "beany"

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

您似乎也对IEnumerable感到困惑,我还有一个要求可以实现:

  

拨打电话......而不依赖于特定的集合类型

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

Public Sub CookBeans(ByVal beans As List(Of BakedBean))

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

Public Sub CookBeans(BvVal beans As IEnumerable(Of BakedBean))
   For Each bean As BakedBean In beans
      Cook(bean)
   Next 
End Sub

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

这是有效的,因为List(Of BakedBean) (或更确切地说,实现)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

如果你需要IEnumerable成为一个列表,那就很简单了:

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

Dim pintos As List(Of BakedBeans) = GetPintos(beans).ToList()
Cook(pintos)

答案 1 :(得分:1)

我认为你可能会有点复杂。除非你真的想学习如何使用IEnumerable,否则你只需要继承一个列表。

Public Class TinOfBeans
    Inherits List(Of BakedBean)

End Class

或者在Tin中有一个列表

Public Class TinOfBeans
    Public Property Beans As New List(Of BakedBean)

End Class