質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

2301閲覧

VB.NET リスト(of T)配列の生成方法

LogicMagic

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/01/30 03:04

前提・実現したいこと

VB.NETで下記の最後にある「箱は 配列型 List<int>[ ] → 中に入っている小箱は int 型の List」を実装したいと思っております。
http://koshinran.hateblo.jp/entry/2017/06/22/202924

C#であれば問題ないのですが、案件がVB.NET縛りです。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

VB.NET

1Public Class clsNOandID_Ctrl 2 ' ## NoとIDの対応表定義(リスト配列) ## 3 Private lstNoId As List(Of Integer)() 4 5 'コンストラクタ 6 Public Sub New() 7 lstNoId(0) = New List(Of Integer)() 8 lstNoId(1) = New List(Of Integer)() 9 End Sub 10 11 ' ## 添字と値を受け取りリスト配列にAddする ## 12 Public Sub setListNoId(ByVal idx As Integer, ByVal val As Integer) 13 lstNoId(idx).Add(val) 14 End Sub 15 16 Public Function getListNoId() 17 Return lstNoId 18 End Function 19 20 21End Class

試したこと

上記コードのクラスをインスタンス化(Dim c As New clsNOandID_Ctrl)すると、System.NullReferenceExceptionが発生いたします。
こちらはソースコード3行目がlstNoIdの宣言がインスタンス化されていないものだと認識いたしましたので、下記コードに変更いたしました。

VB.NET

1Public Class clsNOandID_Ctrl 2 ' ## NoとIDの対応表定義(リスト配列) ## 3 Private lstNoId As List(Of Integer)() 4 5 'コンストラクタ 6 Public Sub New() 7 lstNoId = New List(Of Integer)() ' !!!!!!!!! この行を追加 !!!!!!! 8 lstNoId(0) = New List(Of Integer)() 9 lstNoId(1) = New List(Of Integer)() 10 End Sub 11 12 ' ## 添字と値を受け取りリスト配列にAddする ## 13 Public Sub setListNoId(ByVal idx As Integer, ByVal val As Integer) 14 lstNoId(idx).Add(val) 15 End Sub 16 17 Public Function getListNoId() 18 Return lstNoId 19 End Function 20 21 22End Class

すると、エラー BC30311 型 'List(Of Integer)' の値を 'List(Of Integer)()' に変換できません。
おそらくNew List(Of Integer)()が配列化されていない、というエラーかと思うのですが、何方か良い解決案をご存知でしたらご教授頂きたく存じます。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

.NET Frameworkプログラミングらしくなくなってしまうとは思うのですが、Visual Basic からの配列アクセス用にReDim を使えばご要望の動きになるかと思います。ReDim ステートメント

要素数3での例を示します。

' VB.NET Public Sub New() ' lstNoId = New List(Of Integer)() ' !!!!!!!!! この行を追加 !!!!!!! ReDim lstNoId(2) lstNoId(0) = New List(Of Integer)() lstNoId(1) = New List(Of Integer)() lstNoId(2) = New List(Of Integer)() Try ' 範囲外アクセス! lstNoId(3) = New List(Of Integer)() Catch ex As Exception Debug.WriteLine(ex.Message) End Try End Sub

動的に配列のサイズを変えたい場合は、PreserveオプションやEraseステートメントの併用もありかと思います。

投稿2018/01/30 04:00

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LogicMagic

2018/01/30 05:39

ご回答頂きありがとうございました。 ReDimを使うという方法もあるのですね。大変勉強になりました。
guest

0

ベストアンサー

List型の配列ってあんまり聞かない気がしますが…
List型のList、では駄目ですか?

vb

1Public Class clsNOandID_Ctrl 2 ' ## NoとIDの対応表定義(リスト配列) ## 3 Private lstNoId As New List(Of List(Of Integer)) '★ちなみにここでNewも指定しちゃえばコンストラクタの1行目は不要 4 5 'コンストラクタ 6 Public Sub New() 7 'lstNoId = New List(Of List(Of Integer)) 8 lstNoId.Add(New List(Of Integer)) ' ★idx=0 9 lstNoId.Add(New List(Of Integer)) ' ★idx=1 10 End Sub 11 12 ' ## 添字と値を受け取りリスト配列にAddする ## 13 Public Sub setListNoId(ByVal idx As Integer, ByVal val As Integer) 14 lstNoId(idx).Add(val) 15 End Sub 16 17 Public Function getListNoId() As List(Of List(Of Integer)) ' ★戻り値の型を指定した方が良いのでは 18 Return lstNoId 19 End Function 20 21End Class

追記:

一応 配列の場合の初期化も

vb

1lstNoId = New List(Of Integer)(1) {} ' !!!!!!!!! この行を追加 !!!!!!!

追記2:

というか No と ID のマッピングであれば、外側は Dictionary の方が良いような気がします。

また、これは たとえば setListNoId() の引数 idx に 9 とか "存在しない添字" が指定された場合はどうなるのでしょうか。
(それともサンプルコードなので省かれているだけで、そういうケースは想定しなくて良い感じですか?)

投稿2018/01/30 03:48

編集2018/01/30 04:09
sk_3122

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LogicMagic

2018/01/30 05:37

ご回答頂きありがとうございました。 こちらのケースですと修正にほとんど時間がかからないため、やってみます。 Dictionaryにつきましてもご教授頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問