2013-10-29 86 views
6

尽管场景很奇怪,但并非作业问题。我刚刚用我正在使用的真实对象来简化示例。创建集合对象

This让我从这里开始,但不确定如何继续。我试图写一个包含集合的类,并且我迷失在IEnumeratorIEnumerable的世界中,这是我非常陌生(甚至不完全确定我在正确的道路上)。比方说,我有一个类:

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

而另一个类来表示的BakedBean个集合:

Public Class TinOfBeans 
    '? 
End Class 

我希望能够在TinOfBeans类来获得Beans的收集,从而使我可以拨打电话这样的,但没有被捆绑到特定集合类型:

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

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

myTin(0).Flavour = "beany" 

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

BakedBean类

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 

TinOfBe答类

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 

在这一点上我得到的结,而捆绑起来,而且不知道如何着手(或者,正如我在开始时说,如果这是即使是正确的做法)。有什么建议么?

+0

让我看看,如果我理解你。你想要一个List的类? – Alexandre

+0

我想要一个类是一个集合,不一定是一个List。 – Kai

+0

我可以问你为什么需要这个?标准收藏有什么问题? – Alexandre

回答

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" 

您的每条线都完全匹配。让泛型集合为您做好工作。

你似乎也有困惑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) 
+0

”IEnumerable是所有集合的根接口。“真正没有想到这一点。看起来像我以后,因为它不限制我一个特定的集合。完美,谢谢 – Kai

+1

@Kai请注意:这句话里有些夸张。它是框架中提供的所有集合的根接口,但是我已经在野外看到了自定义集合,它们封装了数组或列表而没有自己实现该接口。这是不好的习惯,但它发生了。 –

+0

我会记住它的。这应该满足我的需求,谢谢。 – Kai

1

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

Public Class TinOfBeans 
    Inherits List(Of BakedBean) 

End Class 

或者有一个列表中的锡

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

End Class 
+1

或者甚至不打扰继承,只需在需要时写出'List(Of BakedBean)'。 “ –