Vb.net 创建集合对象

Vb.net 创建集合对象,vb.net,collections,Vb.net,Collections,这不是一个家庭作业问题,尽管场景很奇怪。我刚刚替换了我正在使用的真实对象,以简化示例 让我从这里开始,但不确定如何继续。我正试图编写一个包含集合的类,但我在IEnumerator和IEnumerable的世界中迷失了方向,我对这两个领域非常陌生(甚至不完全确定我走的是正确的道路)。假设我有一门课: Public Class BakedBean Private Shape As String Private Variety As String Private Flavour

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

让我从这里开始,但不确定如何继续。我正试图编写一个包含集合的类,但我在
IEnumerator
IEnumerable
的世界中迷失了方向,我对这两个领域非常陌生(甚至不完全确定我走的是正确的道路)。假设我有一门课:

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
我希望能够将
TinOfBeans
类中的
bean
作为一个集合,这样我就可以进行如下调用,但不必绑定到特定的集合类型:

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

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

myTin(0).Flavour = "beany"

我一直在看
IEnumerable
IEnumerator
,到目前为止,我已经了解了很多,但我对它非常迷茫:

烘焙豆类

Public Class BakedBean
    Private Shape As String
    Private Variety As String
    Private Flavour As String
    'etc
End Class
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
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
豆分子类

Public Class BakedBean
    Private Shape As String
    Private Variety As String
    Private Flavour As String
    'etc
End Class
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
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
TinOfBeans类

Public Class BakedBean
    Private Shape As String
    Private Variety As String
    Private Flavour As String
    'etc
End Class
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
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

在这一点上,我陷入了困境,不知道如何继续(或者,正如我在开始时所说,如果这是正确的方法)。有什么建议吗?

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

Public Class TinOfBeans
    Inherits List(Of BakedBean)

End Class
或者在罐子里放一张清单

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

End Class

你这样做太难了。Net已经通过使用泛型提供了所需的精确类

我想能够。。。打这样的电话:

当然。以下是方法:

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

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

myTin(0).Flavour = "beany"
你的每一条线都映射得很精确。让泛型集合为您完成这项工作

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

打电话。。。没有绑定到特定集合类型

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

Public Sub CookBeans(ByVal beans As List(Of BakedBean))
但是,这不处理数组、迭代器或其他BakedBean集合类型。这里的答案是数不清的:

Public Sub CookBeans(BvVal beans As IEnumerable(Of BakedBean))
   For Each bean As BakedBean In beans
      Cook(bean)
   Next 
End Sub
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
这一次我包括了该方法的一个示例实现,这样您就可以看到它是如何工作的。这里需要了解的重要一点是,此方法将允许您调用它并传递数组、列表、迭代器或任何其他BakedBean集合


这是因为
列表(BakedBean)
是一个
IEnumerable(BakedBean)
。BakedBean数组和其他.Net集合也是如此。IEnumerable是所有集合的根接口。您可以在内存中的某个地方有一个具体的列表(BakedBean)对象,但是使用
IEnumerable(BakedBean)
定义您的方法参数和返回类型,如果您决定将该列表对象更改为其他对象,那么这些方法仍然有效

您还可以返回IEnumerable:

Public Sub CookBeans(BvVal beans As IEnumerable(Of BakedBean))
   For Each bean As BakedBean In beans
      Cook(bean)
   Next 
End Sub
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)

让我看看我是否理解你。你想要一个列表类?我想要一个集合类,不一定是列表类。请问你为什么需要这个?标准集合有什么问题?当然,我可以在我的
TinOfBeans
类中粘贴一个
私有bean作为列表(烘焙bean)
,并通过一个属性公开它,但是我永远被绑定到
列表上。如果我以后需要将其更改为
字典
或任何东西(世界需要更多的bean字典!),我会冒着破坏所有涉及它的代码的风险。我不能完全取消
TinOfBeans
类,用
列表(烘焙豆)
替换整个东西,因为它会有
List
没有的额外方法(
Cook()
),感谢您提供的信息,尽管我不知道如何做,但我发现这个链接可能很有用:我希望它能帮助您。或者甚至不用麻烦继承,在需要时写下
List(Of BakedBean)
。“IEnumerable是所有集合的根接口。”我真的没有想到这一点。看起来正是我想要的,因为它没有将我限制在特定的集合中。完美的thanks@Kai这里要小心:这句话有些夸张。它是框架中提供的所有集合的根接口,但我在野外看到过一些自定义集合,它们封装了数组或列表,而自己却没有实现该接口。这是拙劣的练习,但它总会发生。我会记住的。不过,这应该满足我的需要,谢谢。@JoelCoehoorn有一个问题,你放的所有方法都像:Public-Sub-CookBeans(BvVal-beans作为IEnumerable(BakedBean的)),GetPintos它应该仍然属于BakedBean类还是作为存储私有列表对象的集合类的分离类?