C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: カスタムクラスに動的追加する方法


(過去ログ 144 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■84717 / inTopicNo.1)  カスタムクラスに動的追加する方法
  
□投稿者/ yosi (1回)-(2017/07/29(Sat) 11:53:50)

分類:[VB.NET/VB2005 以降] 

カスタムクラスに動的追加する方法

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
       Dim mydat As New BClass({ _
                                 New AClass("a", "1"), _
                                 New AClass("b", "2"), _
                                 New AClass("c", "3")})

       For Each dat In mydat2
           Console.WriteLine(dat.a1 & " - " & dat.a2)
       Next

End Sub

Public Class AClass
    Public Sub New(ByVal a1 As String, ByVal a2 As String)
        Me.a1 = a1
        Me.a2 = a2
    End Sub
    Public a1 As String
    Public a2 As String
End Class
Public Class BClass
    Implements IEnumerable(Of AClass)
    Private _BClass() As AClass
    Public Sub New(ByVal pArray() As AClass)
        _BClass = New AClass(pArray.Length - 1) {}

        For i As Integer = 0 To pArray.Length - 1
            _BClass(i) = pArray(i)
        Next i
    End Sub
    Public Function GetEnumerator() As IEnumerator(Of AClass) _
                                       Implements IEnumerable(Of AClass).GetEnumerator
        Return DirectCast(_BClass, IEnumerable(Of AClass)).GetEnumerator
    End Function
    Private Function System_Collections_GetEnumerator() As IEnumerator _
                                                           Implements IEnumerable.GetEnumerator
        Return Me.GetEnumerator
    End Function
End Class

Button1_Click を実行

結果
a - 1
b - 2
c - 3

質問ですが、同じ結果を
初期化子を設定しないで行いたいです。

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
       Dim mydat As New BClass({ _
                                 New AClass("a", "1"), _
                                 New AClass("b", "2"), _
                                 New AClass("c", "3")})

       上記の初期化子の部分を

     Dim mydat As New BClass(New AClass() {})
    
          設定しないで、追加する方法でおこないたいです。
   

End Sub

下記を実行しましたら、当然ですが最終の要素しか出力されません。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
       Dim a1ary() As String = {"a", "b", "c"}
       Dim a2ary() As String = {"1", "2", "3"}

       Dim mydat As New BClass(New AClass() {})

       For j As Integer = 0 To a1ary.Length - 1
           mydat = New BClass({New AClass(a1ary(j), a2ary(j))})
       Next

       For Each dat In mydat
           Console.WriteLine(dat.a1 & " - " & dat.a2)
       Next

    End Sub
結果
c - 3

ご教授お願いします。

引用返信 編集キー/
■84720 / inTopicNo.2)  Re[1]: カスタムクラスに動的追加する方法
□投稿者/ もりお (43回)-(2017/07/29(Sat) 21:18:49)
No84717 (yosi さん) に返信

追加するメソッドを公開して呼び出せばよいですよ
こんな感じで

Public Class BClass
    Implements IEnumerable(Of AClass)

    Private AList As List(Of AClass)

    Public Sub New()
        AList = New List(Of AClass)()
    End Sub

    Public Sub Add(a As AClass)
        AList.Add(a)
    End Sub

引用返信 編集キー/
■84723 / inTopicNo.3)  Re[2]: カスタムクラスに動的追加する方法
□投稿者/ yosi (2回)-(2017/07/30(Sun) 14:34:44)
No84720 (もりお さん) に返信
> ■No84717 (yosi さん) に返信
>
> 追加するメソッドを公開して呼び出せばよいですよ
> こんな感じで
>
> Public Class BClass
> Implements IEnumerable(Of AClass)
>
> Private AList As List(Of AClass)
>
> Public Sub New()
> AList = New List(Of AClass)()
> End Sub
>
> Public Sub Add(a As AClass)
> AList.Add(a)


もりお様ご返信ありがとうございます。
教えていただきましたように、追加が可能なメソッド List を 公開した
ことにより目的とする結果が可能となりました。

フォーム ( Button1_Click ) と 
クラス ( BClass ) 
を下記のようにいたしました。

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

Dim a1ary() As String = {"a", "b", "c"}
Dim a2ary() As String = {"1", "2", "3"}

Dim mydat As New BClass()

For j As Integer = 0 To a1ary.Length - 1
mydat.Add(New AClass(a1ary(j), a2ary(j)))
Next

For Each dat In mydat
Console.WriteLine(dat.a1 & " - " & dat.a2)
Next

End Sub


Public Class BClass
Implements IEnumerable(Of AClass)

Private AList As List(Of AClass)

Public Sub New()
AList = New List(Of AClass)()
End Sub

Public Sub Add(a As AClass)
AList.Add(a)
End Sub

Public Function GetEnumerator() As IEnumerator(Of AClass) _
Implements IEnumerable(Of AClass).GetEnumerator
Return DirectCast(AList, IEnumerable(Of AClass)).GetEnumerator
End Function

Private Function System_Collections_GetEnumerator() As IEnumerator _
Implements IEnumerable.GetEnumerator
Return Me.GetEnumerator
End Function
End Class

結果
a - 1
b - 2
c - 3

動的追加をする為には、追加機能が果たせるメソッド List
が必要というこを理解させていただきました。
ありがとうございました。

> End Sub
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -