0

アルバムごとに自分の曲のリストを取得しようとしています。アルバムと曲の 2 つのクラスを作成したので、次のように整理できます。

Public Class Album
    Sub New()
        Entered = Now
    End Sub
    Public Entered As DateTime
    Public AlbumName As String = ""
    Public Artist As String = ""
    Public YearReleased As Integer = 1900
    Public Songs As New List(Of Song)
End Class

Public Class Song
    Public SongName As String = ""
    Public SongLength As String = ""
End Class

ただし、アルバムに曲を追加すると、常に最後の曲が入力されます。出力結果の例を次に示します。

Protected Sub Test()
    Dim vAlbum As New Album
    Dim vsong As New Song

    vAlbum.AlbumName = "Test 01"
    vAlbum.Artist = "Jackie"
    vAlbum.YearReleased = 2012

    vsong.SongName = "Exit"
    vsong.SongLength = "1.5"
    vAlbum.Songs.Add(vsong)

    vsong.SongName = "Exit II"
    vsong.SongLength = "2.5"
    vAlbum.Songs.Add(vsong)

    For Each sSong As Song In vAlbum.Songs
        Response.Write(sSong.SongName + "<br>")
    Next
End Sub

出力:

  • 出口Ⅱ
  • 出口Ⅱ
  • 私はどこにでもグーグルを持っていますが、すべての曲について最新のレコードが表示されているだけを見つけることができません。

    どんな助けでも大歓迎です。

    ありがとう、フレッド

    4

    2 に答える 2

    2

    古典的な参照問題。vsong は常に同じオブジェクトです。新しいインスタンスをインスタンス化する必要があります:

    ...
    vAlbum.Songs.Add(vsong)
    vsong = new Song()
    vsong.SongName = "Exit II"
    ...
    
    于 2012-09-12T09:49:56.760 に答える
    1

    Songフィールドを変更するだけで、同じものを2回追加しています。

    次のようなものを使用する必要があります。

    Dim vAlbum As New Album
    
    vAlbum.AlbumName = "Test 01"
    vAlbum.Artist = "Jackie"
    vAlbum.YearReleased = 2012
    
    Dim vsong As New Song
    vsong.SongName = "Exit"
    vsong.SongLength = "1.5"
    vAlbum.Songs.Add(vsong)
    
    vsong As New Song ' create a new instance of Song
    vsong.SongName = "Exit II"
    vsong.SongLength = "2.5"
    vAlbum.Songs.Add(vsong)
    

    または、オブジェクト初期化子を使用するか、必要なすべての値を取るコンストラクターを作成します。

    Public Class Song
    
        Public SongName As String = ""
        Public SongLength As String = ""
    
        Public Sub new(name as String, length as String)
            SongName = name
            SongLength = length
        End Sub
    
    End Class
    
    ...
    
    vAlbum.Songs.Add(new Song("Exit", "1.5"))
    vAlbum.Songs.Add(new Song("Exit II", "2.5"))
    
    于 2012-09-12T09:49:10.477 に答える