none
動的配列 List の使い方 RRS feed

  • 質問

  • 動的配列 List に文字列と整数を格納したいとき、文字列と整数を保持するクラスStInを定義して、このクラスのインスタンスをListにAddすればよいと思いますが、Dim si As List((Of String),(Of Integer))= New List((Of String),(Of Integer)) () では可能でしょうか。型は一つしか指定できないのでしょうか。
    2015年4月20日 12:05

回答

すべての返信

  • 標準のListクラスにはそのようなジェネリック定義はないので出来ません。
    ですが、継承することで拡張することは可能です。

    Module Module1
    
        Sub Main()
            Dim list As New List(Of String,Integer)
            list.Add("あ1" , 1)
            list.Add("い1" , 1)
            list.Add("い2" , 2)
        End Sub
    
    End Module
    
    Class StIn(Of T1, T2)
        Sub New()
        End Sub
    
        Sub New(ByVal v1 As T1, ByVal v2 As T2)
            Me.Value1 = v1
            Me.Value2 = v2
        End Sub
    
        Public Property Value1 As T1
        Public Property Value2 As T2
    End Class
    
    Class List(Of T1, T2)
        Inherits List(Of StIn(Of T1, T2))
    
        Public Overloads Sub Add(ByVal v1 As T1, ByVal v2 As T2)
            Me.Add(New StIn(Of T1, T2)(v1, v2))
        End Sub
    End Class
    StInクラスを作っていますが、Tuple(of T1,T2...)というクラスを使うことも可能です。

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2015年4月20日 12:35
  • 念のために、Dictionaryクラスをご紹介しておきます。

    (参考)
    ハッシュテーブル(連想配列)を使うには?(Dictionaryクラス編)[2.0のみ、C#、VB]
    http://www.atmarkit.co.jp/fdotnet/dotnettips/429dictionary/dictionary.html


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年4月21日 1:11
    モデレータ
  • 拡張メソッドを作ってあげるのでもいい気がします。

    Module Module1
        Sub Main()
            Dim si = New List(Of StIn)
            si.Add("あ", 1)
        End Sub
    End Module
    
    Class StIn
        Public Property Value1 As String
        Public Property Value2 As Integer
    End Class
    
    Module StInExtension
        <System.Runtime.CompilerServices.Extension()>
        Public Sub Add(source As List(Of StIn), value1 As String, value2 As Integer)
            source.Add(New StIn With {.Value1 = value1, .Value2 = value2})
        End Sub
    End Module

    2015年4月21日 3:39
  • 1970年代Fortranでプログラミングしてた者です。最近の言語(VB.NET等)には驚きます。まず習得しずらい、趣味でVB.NETを書籍で独学していますが、書店にでている本で習得するのはかなり難しいと思います。

    Class StIn(Of T1,T2)の構文は、説明のコーディングで理解できました。この構文は書店に並べられている本には、ほとんど書かれていないと思います。次に、

    Class List(Of T1,T2)

      Inherits List(Of StIn(Of T1,T2))  継承ですが、List(Of StIn(Of T1,T2))のインスタンスをクラス内で保持させる方法が、直感的に思いつきますが、クラスであるList(Of StIn(Of T1,T2))はコンパイラーの方で作ってくれるのですか。

    最近の言語の特徴は、ユーザー定義型と参照の方法だと思いますが、なにかSQLに似ています。、Addメソッドのオバーロードですが、たまたま同じシグネチャーがあった場合、オバーロードのオーバーライドすればよいのですか初歩的なことですが。このプログラムの説明でなんとか理解できました。

    2015年4月21日 10:52
  • Sub  Main( )

        Dim  List As  New List(Of String,Integer,String)

        List.Add(”あ”、1、”A")

    End Sub

    これでいけますか。Class StIn(Of T1,T2)とList(Of T1,T2)は、パターン的なのでコンパイラーの方で作ってもらうことにすればよいように

    思われます。クラス名(Of T1,T2)の構文がどういう指示をだしているのかということです。

    2015年4月24日 5:20
  • クラス名(Of T1,T2)の構文がどういう指示をだしているのかということです。

    最終的なゴールとしてどこを目指しておられるかイマイチ判然としませんが、ジェネリックについては、以下の記事が参考になるのではないでしょうか?

    ジェネリック・クラスで変わるC#とVBのコレクション

    StIn(Of T1,T2)とList(Of T1,T2)は、パターン的なのでコンパイラーの方で作ってもらうことにすればよいように思われます。

    コンパイラは上記 List(Of String,Integer,String) のコードから二つのクラス StIn(Of T1,T2) と List(Of T1,T2) を生成することはありません。また List(ジェネリック型) で指定できる型パラメータは一つだけです。またなにをもって「パターン」と言われてるかも不明です。何か根本的に勘違いされてるように思います。


    ぜひ 「フォーラムでご質問頂くにあたっての注意点」 もご覧ください https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?forum=announceja



    2015年4月24日 5:52
    モデレータ
  • Generics機能をサポートしたListクラスの方が、ArrayListより高速とある本に書かれていたのですが。高速の理由はListクラスは型指定

    が一つよってキャスト不要。ArrayListは複数の型の種類を格納可能だから、何番目にどの型を格納したのかを、覚えておきその型でキャストが必要、よってListの方が高速と理解してよろしいでしょうか。

    2015年4月24日 9:27
  • 社長を目指しています(小さい会社ですが)。
    2015年4月24日 9:47