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

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

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

Re[8]: 変化する変数の宣言


(過去ログ 49 を表示中)

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

■26676 / inTopicNo.1)  変化する変数の宣言
  
□投稿者/ 金曜日 (1回)-(2008/10/17(Fri) 11:16:37)

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

ご指導お願いいたします。

あるメソッドの戻り値に、Class で宣言した変数を使っております。
こんな感じです。


Public Class1 C_A
Public str01 As String = ""
End Class

Public Function F_A(ByVal p_F) As Class1
Dim myOrder As Class1 = New Class1()

{処理}

myOrder.str01 = {結果}
Return myOrder
End Function


この形を崩さずに、クラスで宣言している変数を
str01
str02
:
strnn

と、動的にしたいと思っております。

構造体を使えばできそうなのですが、.NET2.0 VB2005では
typeで出来ないのでしょうか?


よろしくお願いいたします。
引用返信 編集キー/
■26677 / inTopicNo.2)  Re[1]: 変化する変数の宣言
□投稿者/ Hongliang (305回)-(2008/10/17(Fri) 11:32:18)
配列やリストじゃ駄目なんですか?
引用返信 編集キー/
■26678 / inTopicNo.3)  Re[1]: 変化する変数の宣言
□投稿者/ 初心者 (156回)-(2008/10/17(Fri) 11:34:23)
No26676 (金曜日 さん) に返信
> ご指導お願いいたします。
>
> あるメソッドの戻り値に、Class で宣言した変数を使っております。
> こんな感じです。
>
>
> Public Class1 C_A
> Public str01 As String = ""
> End Class
>
> Public Function F_A(ByVal p_F) As Class1
> Dim myOrder As Class1 = New Class1()
>
> {処理}
>
> myOrder.str01 = {結果}
> Return myOrder
> End Function
>
>
> この形を崩さずに、クラスで宣言している変数を
> str01
> str02
> :
> strnn
>
> と、動的にしたいと思っております。
>
> 構造体を使えばできそうなのですが、.NET2.0 VB2005では
> typeで出来ないのでしょうか?
>
>
> よろしくお願いいたします。

やりたいことがいまいち理解できませんが。

> Public str01 As String = ""

コレをArrayListにしてやるとか。

引用返信 編集キー/
■26679 / inTopicNo.4)  Re[2]: 変化する変数の宣言
□投稿者/ 金曜日 (2回)-(2008/10/17(Fri) 11:36:15)
No26677 (Hongliang さん) に返信
> 配列やリストじゃ駄目なんですか?

Hongliang さん
ありがとうございます。

戻り値を受け取る側が配列ではなくて、文字列変数をXMLのタグに使用しているものですから
使えないです。


引用返信 編集キー/
■26680 / inTopicNo.5)  Re[2]: 変化する変数の宣言
□投稿者/ 金曜日 (3回)-(2008/10/17(Fri) 11:38:37)
>
> やりたいことがいまいち理解できませんが。
>
>> Public str01 As String = ""
>
> コレをArrayListにしてやるとか。
>

初心者さん
ありがとうございます。

先に書き込んだのですが、どうにもこうにも・・・
連想配列を、変数宣言に使えないか調べているところです。
引用返信 編集キー/
■26681 / inTopicNo.6)  Re[3]: 変化する変数の宣言
□投稿者/ みきぬ (149回)-(2008/10/17(Fri) 11:43:53)
よくわかりませんが、Hashtable おいときますね。
http://msdn.microsoft.com/ja-jp/library/system.collections.hashtable(VS.80).aspx

VB2005以降なら Dictionary ジェネリック クラスのほうがいいかな。
http://msdn.microsoft.com/ja-jp/library/xfhwa508(VS.80).aspx
引用返信 編集キー/
■26682 / inTopicNo.7)  Re[3]: 変化する変数の宣言
□投稿者/ 初心者 (157回)-(2008/10/17(Fri) 11:44:15)
No26679 (金曜日 さん) に返信
> ■No26677 (Hongliang さん) に返信
>>配列やリストじゃ駄目なんですか?
>
> Hongliang さん
> ありがとうございます。
>
> 戻り値を受け取る側が配列ではなくて、文字列変数をXMLのタグに使用しているものですから
> 使えないです。
>
>

>あるメソッドの戻り値に、Class で宣言した変数を使っております。

>Public Function F_A(ByVal p_F) As Class1

ところで・・・「Class で宣言した変数」を返しているようには見えないのですが。
(Class1を返していますよね)

戻り先でどんな処理をしているのかという情報があったほうが回答は得られやすいと思います。
引用返信 編集キー/
■26683 / inTopicNo.8)  Re[4]: 変化する変数の宣言
□投稿者/ 金曜日 (4回)-(2008/10/17(Fri) 11:47:06)
No26681 (みきぬ さん) に返信
> よくわかりませんが、Hashtable おいときますね。
> http://msdn.microsoft.com/ja-jp/library/system.collections.hashtable(VS.80).aspx
>
> VB2005以降なら Dictionary ジェネリック クラスのほうがいいかな。
> http://msdn.microsoft.com/ja-jp/library/xfhwa508(VS.80).aspx

みきぬ さん
情報ありがとうございます、早速調べてみます。

引用返信 編集キー/
■26684 / inTopicNo.9)  Re[4]: 変化する変数の宣言
□投稿者/ 金曜日 (5回)-(2008/10/17(Fri) 11:51:25)
>
> >あるメソッドの戻り値に、Class で宣言した変数を使っております。
>
> >Public Function F_A(ByVal p_F) As Class1
>
> ところで・・・「Class で宣言した変数」を返しているようには見えないのですが。
> (Class1を返していますよね)
>
> 戻り先でどんな処理をしているのかという情報があったほうが回答は得られやすいと思います。

初心者さん
ありがとうございます。

実はメソッドF_AのreturnでClass1のインスタンスmyOrderを返しています。
戻り先は、変数”名”をXMLのタグに使っているものですから、こんなややこしくなってしまいました。

引用返信 編集キー/
■26685 / inTopicNo.10)  Re[5]: 変化する変数の宣言
□投稿者/ 金曜日 (6回)-(2008/10/17(Fri) 11:54:18)
あ、書き忘れました。

Class1では

<XmlElement(ElementName:="str01")> Public str01 as string

と宣言しています.



引用返信 編集キー/
■26689 / inTopicNo.11)  Re[6]: 変化する変数の宣言
□投稿者/ ま (138回)-(2008/10/17(Fri) 13:28:10)
"str01" って指定したら XML の <str01> タグの値が取れればいいのかな?

SortedList とか。

入力XMLの仕様とコード上からXMLタグをどのように指定してどのような値を取りたいのか
をもう少し詳細に書いたらいいですね。
おそらく、
<str01 value="1" name="山田" />
<str02 value="2" name="田中" />
<str03 value="3" name="上下" />
<str04 value="4" name="左右" />
...
<str99 value="99" name="九九" />

こんなんじゃなかろうかと思いますが。構造体がどーのこーのだから、値の部分が
クラスにでもなるのかな?

で、こんなんやつを、
"str01" をキーにして 値を("1" , "山田") で保持したいってことでしょう?

public class XXX
   private value as String  //strXX のプロパティ
   private name as String  //strXX のプロパティ
   private tag as String //XML の タグ名 str01 〜 str99 まで?(タグ名でソートする場合に使う、及びマップのキー)
   private index as Integer //XML の上からの定義順序(定義順序でソートする場合に使う)
end class

なんちゅークラスでもこさえて、

private _map as new HashMap

_map.put(xxx.tag, xxx)

とかしておいて、

プログラムからは、

_map.get("str01") とか名指しで取得する。

定義順序が重要な局面では、index でソートして、
タグ名の序列が重要なら tag でソートかければ

順序に関してもOKですね。


XML は全部読み込んでから、"str01" から "str99" まですべてのノードを検索して
そのプロパティでもって、XXX クラス作ってどーたらこーたらで完成です。

連想配列って言葉を知っているってことは Perl/PHP の知識はあるんですよね、
あれと同じです。あれの場合はこーなるから、VBならこーなるって適当に組んじゃえば
OK。



引用返信 編集キー/
■26690 / inTopicNo.12)  Re[7]: 変化する変数の宣言
□投稿者/ 金曜日 (7回)-(2008/10/17(Fri) 14:18:27)
ま さん
ありがとうございます。


No26689 (ま さん) に返信
> "str01" って指定したら XML の <str01> タグの値が取れればいいのかな?
>
> SortedList とか。
>
> 入力XMLの仕様とコード上からXMLタグをどのように指定してどのような値を取りたいのか
> をもう少し詳細に書いたらいいですね。

説明不足ですみません。


> おそらく、
> <str01 value="1" name="山田" />
> <str02 value="2" name="田中" />
> <str03 value="3" name="上下" />
> <str04 value="4" name="左右" />
> ...
> <str99 value="99" name="九九" />
>
> こんなんじゃなかろうかと思いますが。構造体がどーのこーのだから、値の部分が
> クラスにでもなるのかな?

タグは、<str01>string</str01> みたいな様子になりますが、おっしゃるとおり最大要素数は不定です。


>
> で、こんなんやつを、
> "str01" をキーにして 値を("1" , "山田") で保持したいってことでしょう?

そうなんです。


>
> public class XXX
> private value as String //strXX のプロパティ
> private name as String //strXX のプロパティ
> private tag as String //XML の タグ名 str01 〜 str99 まで?(タグ名でソートする場合に使う、及びマップのキー)
> private index as Integer //XML の上からの定義順序(定義順序でソートする場合に使う)
> end class
>
> なんちゅークラスでもこさえて、
>
> private _map as new HashMap
>
> _map.put(xxx.tag, xxx)
>
> とかしておいて、
>
> プログラムからは、
>
> _map.get("str01") とか名指しで取得する。
>
> 定義順序が重要な局面では、index でソートして、
> タグ名の序列が重要なら tag でソートかければ
>
> 順序に関してもOKですね。

なるほど、拡張機能まで至れり尽くせりで感謝です。

>
> XML は全部読み込んでから、"str01" から "str99" まですべてのノードを検索して
> そのプロパティでもって、XXX クラス作ってどーたらこーたらで完成です。

読み取り側は既存のコードなので手が出せなくって困ってます(・;)

>
> 連想配列って言葉を知っているってことは Perl/PHP の知識はあるんですよね、
> あれと同じです。あれの場合はこーなるから、VBならこーなるって適当に組んじゃえば
> OK。
>

おっしゃるとおりです。とりあえず教えていただいたことを実施してみたいと思います。
ありがとうございます。

引用返信 編集キー/
■26697 / inTopicNo.13)  Re[5]: 変化する変数の宣言
□投稿者/ なちゃ (182回)-(2008/10/17(Fri) 16:12:11)
読み取りがXmlSerializerなら、IXmlSerializable辺りを実装する事になるのかな?
でも要素名可変て出来たかな…?詳しくないのでごめんなさい。


引用返信 編集キー/
■26832 / inTopicNo.14)  Re[6]: 変化する変数の宣言
□投稿者/ 金曜日 (8回)-(2008/10/21(Tue) 19:48:57)
No26697 (なちゃ さん) に返信
> 読み取りがXmlSerializerなら、IXmlSerializable辺りを実装する事になるのかな?
> でも要素名可変て出来たかな…?詳しくないのでごめんなさい。
>
>

なちゃさん
ありがとうございます

PHPでは、HTTPヘッダーから何から全て標準出力しています。
なので要素名も、print "<あああ"+iCount+">" みたいなことができちゃったりします。

VBでは、メソッドのレスポンスはどういう定義になってるんですか?

VBのほうがややこしい(T-T)
引用返信 編集キー/
■26879 / inTopicNo.15)  Re[7]: 変化する変数の宣言
□投稿者/ Tram (11回)-(2008/10/22(Wed) 15:42:26)
IXmlSerializableを実装してみました。

データを格納するクラス(TestClass)です。
名前が超適当な上に、必要最低限な実装ですが…
-----------------
Imports System.Xml.Schema
Imports System.Xml.Serialization
Imports System.Collections.Generic

Public Class TestClass
    Implements IXmlSerializable

    Public Items As Dictionary(Of String, String)

    Public Sub New()
        Me.Items = New Dictionary(Of String, String)
    End Sub

    Public Function GetSchema() As System.Xml.Schema.XmlSchema Implements System.Xml.Serialization.IXmlSerializable.GetSchema
        Return Nothing
    End Function

    Public Sub ReadXml(ByVal reader As System.Xml.XmlReader) Implements System.Xml.Serialization.IXmlSerializable.ReadXml
        '省略
    End Sub

    Public Sub WriteXml(ByVal writer As System.Xml.XmlWriter) Implements System.Xml.Serialization.IXmlSerializable.WriteXml
        For Each key As String In Me.Items.Keys
            writer.WriteElementString(key, Me.Items(key))
        Next
    End Sub
End Class
-----------------

そしてこんな感じに値をセットしていきます。
Dim tc As TestClass = New TestClass
tc.Items.Add("str01", "aaa")
tc.Items.Add("str02", "bbb")
tc.Items.Add("str03", "ccc")
で、XMLへとシリアライズすると、以下のような結果になりました。
<?xml version="1.0"?>
<TestClass>
  <str01>aaa</str01>
  <str02>bbb</str02>
  <str03>ccc</str03>
</TestClass>

目的に適っているでしょうか??
ReadXmlメソッドを思いっきり省略しているので、
もしXMLからデシリアライズするなら実装しないといけませんが。。

引用返信 編集キー/
■26978 / inTopicNo.16)  Re[8]: 変化する変数の宣言
□投稿者/ 金曜日 (9回)-(2008/10/24(Fri) 11:06:05)
No26879 (Tram さん) に返信
> IXmlSerializableを実装してみました。
>
> データを格納するクラス(TestClass)です。
> 名前が超適当な上に、必要最低限な実装ですが…
> -----------------
> Imports System.Xml.Schema
> Imports System.Xml.Serialization
> Imports System.Collections.Generic
>
> Public Class TestClass
> Implements IXmlSerializable
>
> Public Items As Dictionary(Of String, String)
>
> Public Sub New()
> Me.Items = New Dictionary(Of String, String)
> End Sub
>
> Public Function GetSchema() As System.Xml.Schema.XmlSchema Implements System.Xml.Serialization.IXmlSerializable.GetSchema
> Return Nothing
> End Function
>
> Public Sub ReadXml(ByVal reader As System.Xml.XmlReader) Implements System.Xml.Serialization.IXmlSerializable.ReadXml
> '省略
> End Sub
>
> Public Sub WriteXml(ByVal writer As System.Xml.XmlWriter) Implements System.Xml.Serialization.IXmlSerializable.WriteXml
> For Each key As String In Me.Items.Keys
> writer.WriteElementString(key, Me.Items(key))
> Next
> End Sub
> End Class
> -----------------
>
> そしてこんな感じに値をセットしていきます。
> Dim tc As TestClass = New TestClass
> tc.Items.Add("str01", "aaa")
> tc.Items.Add("str02", "bbb")
> tc.Items.Add("str03", "ccc")
> で、XMLへとシリアライズすると、以下のような結果になりました。
> <?xml version="1.0"?>
> <TestClass>
> <str01>aaa</str01>
> <str02>bbb</str02>
> <str03>ccc</str03>
> </TestClass>
>
> 目的に適っているでしょうか??
> ReadXmlメソッドを思いっきり省略しているので、
> もしXMLからデシリアライズするなら実装しないといけませんが。。


Tram さん
ご丁寧にありがとうございます。

内容のほう早速使用させていただきます。

いろいろな情報を精査した結果、XMLで返信する内容はこうなりました。
<?xml version="1.0"?>
 <BODY>
<str>aaa</str>
<str>bbb</str>
<str>ccc</str>
     :
</BODY>

受け取り側で順読みしてもらいます。<ちからこぶ>

やりかたは、メソッドの型に文字型の配列を定義することで可能でした。


皆さんにいろいろとご指導していただくことで、何とか解決できました。
本当にありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -