6

シナリオの奇妙さにもかかわらず、宿題の質問ではありません。例を単純化するために、使用している実際のオブジェクトを置き換えただけです。

これでここから始めましたが、続行する方法がわかりません。コレクションを含むクラスを作成しようとしていますが、の世界で迷子になって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

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 クラス

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

この時点で、私は結び目にかなり縛られており、先に進む方法がわかりません (または、最初に述べたように、これが正しいアプローチであるかどうかもわかりません)。助言がありますか?

4

2 に答える 2

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で、実装する必要がある要件が 1 つ残っています。

特定のコレクション型に縛られることなく ... を呼び出します

その両方を 1 つのテクニックでカバーできます。Bean コレクションを受け入れるメソッドを定義しましょう。

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

ただし、これは配列、Iterator、またはその他の 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 コレクションを渡すことができるということです。

これが機能するのは、 aList(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)
于 2013-10-29T14:23:53.100 に答える
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
于 2013-10-29T14:05:05.520 に答える