DOBON.NET DOBON.NETプログラミング掲示板過去ログ

動的に多段階配列を作成するには?

環境/言語:[環境(WindowsXP Pro)、使用言語(VB.NET2005)、.NET Frameworkのバージョン(2.0)]
分類:[ASP.NET]

お世話になります。
下記のような配列Aを動的に作成したいと思っています。

配列A
----- ---
1 → A
----- ---
2 B
----- ---
3 C
----- ---
D
---
E
---
:

現在は下記のURL(3-3-6 多段階配列)を参考にしながら記述していますがうまくいきません。
どうが、ご存知な方がいましたらご教授宜しくお願いします。
http://www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-3.aspx

Dim aryValue()() As String
aryValue = New String(n)() {}
aryValue(n) = New String() {値}
※nはその時によって変わります。

では、失礼します。
やりたいことがいまいちよくわからないのですが
たとえばこんな感じですか?

        Dim a()() As String
        a = New String(3)() {}
        a(0) = New String() {"a", "b"}
        a(1) = New String() {"c"}
        a(2) = New String() {"d", "e", "f"}

        For i As Integer = 0 To 3
            If a(i) Is Nothing Then
                Console.WriteLine("a({0}) is Nothing.", i)
            Else
                For j As Integer = a(i).GetLowerBound(0) To a(i).GetUpperBound(0)
                    Console.WriteLine("a({0})({1}) = {2}", i, j, a(i)(j))
                Next
            End If
        Next


実行結果
a(0)(0) = a
a(0)(1) = b
a(1)(0) = c
a(2)(0) = d
a(2)(1) = e
a(2)(2) = f
a(3) is Nothing.
回答ありがとうございます。
説明不足で申し訳ありません。
でも下記のやり方だと動的ではないと思いますが...

> Dim a()() As String
> a = New String(3)() {}
> a(0) = New String() {"a", "b"}
> a(1) = New String() {"c"}
> a(2) = New String() {"d", "e", "f"}

このような配列は使わないのでしょうか?
何か進展がありましたらご報告します。
では、失礼します。
■No17133に返信(ガチャピンさんの記事)
> 回答ありがとうございます。
> 説明不足で申し訳ありません。
> でも下記のやり方だと動的ではないと思いますが...

実行時に要素数を指定して領域を確保しているという点で十分「動的」だとおもいますが、
ガチャピンさんの書いた図とガチャピンさんのいう「動的」の意味が
わからなかったのでこういう意味ですか?と質問したのです。

もし単に要素数や代入している中身がリテラルなのが気に入らないというだけの
意味であれば、
例では実際に動くコードを簡単に書くためにリテラルで3とかいてますが
それは当然mでもnでもよいわけです。
親配列の要素である子配列も説明を簡単にするためリテラルを代入していますが
当然要素数を変数で指定して中身はなんらかのロジックにより代入しても当然かまいません。

たとえば親配列の要素a(x)のString配列の要素数がGetArraySize(x)、
a(x)(y)に代入する文字列がGetArrayItemString(x,y)で得られるとすると
下のように書いてもよいわけですよね。

        Dim a()() As String
        a = New String(n)() {}
        For i As Integer = 0 To n
            a(i) = New String(GetArraySize(i)) {}
            For j As Integer = a(i).GetLowerBound(0) To a(i).GetUpperBound(0)
                a(i)(j) = GetArrayItemString(i,j)
            Next
        Next
■No17133に返信(ガチャピンさんの記事)
> でも下記のやり方だと動的ではないと思いますが...

定義の時に配列の大きさを決めているわけではありませんから 「動的」 になると思います。
要素の大きさがマジックナンバーであること、要素の中身がリテラル文字列であるということを示しているのであれば、それは配列の確保とは関係がないため間違いです。

結局のところ本当に動的に何かを持ちたいのであれば、コレクションを使うべきだと思うのですが、どうでしょうか?
お世話になります。
回答ありがとうございます。

a(0) = New String() {"a", "b"}
上記のようにa(0)の配列に0番目に"a", 1番目に"b"と固定値を
設定されていたので動的ではないと思ってしまいました。
すみませんでした。

下記のソースを参考にしてお蔭様でできました。
本当にありがとうございました。

> Dim a()() As String
> a = New String(n)() {}
> For i As Integer = 0 To n
> a(i) = New String(GetArraySize(i)) {}
> For j As Integer = a(i).GetLowerBound(0) To a(i).GetUpperBound(0)
> a(i)(j) = GetArrayItemString(i,j)
> Next
> Next

質問するだけではなく回答する立場になれるよう頑張ります。
では、失礼します。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板