2013-10-29 123 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)'。 「 –