- PR -

構造体をArrayListにAddした場合の値の変更について

投稿者投稿内容
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2006-01-06 23:25
お世話さまです。

下記のような構造体をArrayListに格納した後、
n番目の値を変更したいのですが、簡単に行う方法はないでしょうか?

Public Structure stTbl
  Public Code As String
  Public Name As ArrayList
End Structure

Dim typTbl As stTbl
Dim ArlTbl As New ArrayList()

typTbl.Code = "1"
typTbl.Name = New ArrayList()
typTbl.Name.Add("名前11")
typTbl.Name.Add("名前12")
typTbl.Name.Add("名前13")
ArlTbl.Add(typTbl)

typTbl.Code = "2"
typTbl.Name = New ArrayList()
typTbl.Name.Add("名前21")
typTbl.Name.Add("名前32")
typTbl.Name.Add("名前23")
ArlTbl.Add(typTbl)

ここで、ArlTbl(1).Name(1)の"名前32"を"名前22"に変更したいのです。

現状では、下記のように1番目のArrayListを削除して、
内容をセットし直して追加しています。

ArlTbl.RemoveAt(1)
typTbl.Code = "2"
typTbl.Name = New ArrayList()
typTbl.Name.Add("名前21")
typTbl.Name.Add("名前22")
typTbl.Name.Add("名前23")
ArlTbl.Add(typTbl)

ダイレクトにNameフィールドだけを変更するような方法はないでしょうか?

以上、ご教示のほど宜しくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-07 00:14
引用:

moondogさんの書き込み (2006-01-06 23:25) より:

ダイレクトにNameフィールドだけを変更するような方法はないでしょうか?


キャストして書き換えるだけでしょうけど、
その前に Name は ArrayList である必要はないような... (^^;)

複雑なテーブル構造になってます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2006-01-07 05:58
じゃんぬねっと様、早速のレスありがとうございます。

キャストして書き換えるには、具体的にはどのように
書けば良いのでしょうか?

If DirectCast(DirectCast(ArlTbl(1), stTbl).Name(1), String) = "名前22" Then
・・・・
End If

のように、参照は当然可能なんですが、

DirectCast(DirectCast(ArlTbl(1), stTbl).Name(1), String) = "名前22"

という具合に設定しようとすると、『参照しかできません!』
みたいなエラーメッセージで弾かれてしまいます。

お手数をおかけしますが、ご教示のほど宜しくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-07 09:14
引用:

moondogさんの書き込み (2006-01-07 05:58) より:

キャストして書き換えるには、具体的にはどのように書けば良いのでしょうか?


まず、Name に ArrayList を採用する意味がありません。
型が付与できる場合は、型を使うことを強く推奨します。(CLR の主役は型です)
このように書き換えてみました。

コード:

    Public Structure stTbl 
      Public Code As String
      Public Name As System.Collections.Specialized.StringCollection
    End Structure

    Public Sub OneMethod()
        Dim typTbl As stTbl
        Dim ArlTbl As New System.Collections.ArrayList()

        typTbl.Code = "1"
        typTbl.Name = New System.Collections.Specialized.StringCollection()
        typTbl.Name.Add("名前11")
        typTbl.Name.Add("名前12")
        typTbl.Name.Add("名前13")
        ArlTbl.Add(typTbl)

        typTbl.Code = "2"
        typTbl.Name = New System.Collections.Specialized.StringCollection()
        typTbl.Name.Add("名前21")
        typTbl.Name.Add("名前22")
        typTbl.Name.Add("名前23")
        ArlTbl.Add(typTbl)

        DirectCast(ArlTbl(1), stTbl).Name(1) = "書き換えた"

        MessageBox.Show(DirectCast(ArlTbl(1), stTbl).Name(1))
    End Sub


ところで、Class ではなく Structure を選択された理由を教えてください。

参照型の ArrayList の中に格納された値型の Structure があって、
片割れとなる参照型の ArrayList がさらに中に含まれる、
という構造を見ているとちょっと混乱しますね。(^^;)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-01-07 21:55
これかなぁ
http://www.atmarkit.co.jp/fdotnet/onepoint/onepoint02/onepoint02_01.html
________________________________
□ Posted by Jitta on 2006/01/07
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2006-01-09 16:04
じゃんぬねっと様、レスありがとうございました。
そして、遅レスになってしまい申し訳ありませんでした。

>まず、Name に ArrayList を採用する意味がありません。
勉強不足のため、StringCollectionなるものの存在を知りませんでした。^^;

>型が付与できる場合は、型を使うことを強く推奨します。
了解しました!
以後、肝に銘じます。

>ところで、Class ではなく Structure を選択された理由を教えてください。
変数の格納型として、クラス化するという発想に及びませんでした。

部品をなんとなくクラス化したことはあるのですが、
実は、未だにどのようなモノをクラス化して、
どのようなモノをPublicモジュール化すべきなのかの
住み分けも理解できてない初心者です。

ご教示頂いた手法で、入れ子のArrayListをStringCollection
に書き換えてみようと思います。

ご教示ありがとうござました。
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2006-01-09 16:07
Jitta様、レスありがとうございます。

ご指摘の件は、単なる買いかぶりでございます。^^;

しかし、そういった意図も存在するんですね。
勉強になりました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-09 22:32
引用:

moondogさんの書き込み (2006-01-09 16:04) より:

部品をなんとなくクラス化したことはあるのですが、
実は、未だにどのようなモノをクラス化して、
どのようなモノをPublicモジュール化すべきなのかの
住み分けも理解できてない初心者です。


リファレンスを見てからご検討頂いた方が良いと思います。

  構造体とクラス

事前知識がなければ、分けられませんよね。
誰でもそうなんですが、判らないことは判断できません。(^^)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)