代入に異様に時間がかかるテキストボックスのはなぜ?

解決


ヤコブ  2005-09-08 07:24:08  No: 125011

こんにちわ!
環境は.NET2003なのですが、
下のコードを書いて実行してみると
エラーにはならず、固まったようになります。
ただなぜか文字列は表示されないのに
スクロールバーが小さくなっているのが伺えます。
しかし、結果として表示されません。
なぜなのでしょうか?
嘘だと思う方はためしにやってみてください。
詳しいかたいらっしゃいますか?
Dim MyStringBuilder As New System.Text.StringBuilder("")
        kasu = 150
        For A = 0 To 15 'UBound(tamakazu)
            For M = 0 To 15 'UBound(erabukazu)
                For n = 0 To money Step 10
                    erabukazu(M) = n
                    tamakazu(A) = Partition(erabkazu(M), 0, kazu, 10)
                    MyStringBuilder.Append(tamakazu(A))
                    MyStringBuilder.Append(Environment.NewLine) 
                    TextBox1.Text = MyStringBuilder.ToString
                Next n
            Next M
        Next A


コンパイルエラー  2005-09-08 07:39:35  No: 125012

A, M, n, kasu, erabukazu, tamakazu, Partition が定義されていません。


ヤコブ  2005-09-08 07:50:57  No: 125013

あ!ここでは定義は省略しています。
実際には宣言しているので安心してください。
僕が言っているのは、エラー表示が出ないのに
表示されないことをいっているのです。
ちなみにPartitionは関数なので宣言する必要は無いように思いますが。


魔界の仮面弁士  2005-09-08 07:55:52  No: 125014

ループ中で何度も Textプロパティを設定していたら、
それは時間が掛かるでしょうね……。(^_^;)

Text プロパティを書き換えるという事は、前の文字列データを
すべて破棄して、別の文字列を代入するような状況です。
そのたびにメモリの破棄と再確保が発生するわけですから、
文字列が長くなるほど、処理時間が長くなります。

StringBuilderを使って連結するのであれば、ループ中で、
Textプロパティを毎回セットしなおすのではなく、
すべてのループが完了後に、最後に一回だけ
   TextBox1.Text = MyStringBuilder.ToString()
を呼び出すようにしてください。これなら、さほど時間はかかりません。

もし、最後に一度だけ代入するのではなく、データが追加される状況を
常に表示させておきたいのであれば、ループ中では、
    TextBox1.Text = 全文
ではなく、
    TextBox1.AppendText(追記データ)
の構文を使うようにすると良いでしょう。


ヤコブ  2005-09-08 09:01:53  No: 125015

まあ、一応最初の質問のところの回答で解決できたのはできたのですが、
またあらたなこまったことが発生してしまいました。
下記のコードを実行すると
 Dim MyStringBuilder As New System.Text.StringBuilder("")
        money = 150
        For A = 0 To 15 'UBound(tamakazu)
            For M = 0 To 15 'UBound(erabukazu)
                For n = 0 To money Step 10
                    検索値段(M) = n
                    下限上限(A) = Partition(検索値段(M), 0, money, 10)
                    MyStringBuilder.Append(下限上限(A))
                    MyStringBuilder.Append(Environment.NewLine)
                Next n
            Next M
        Next A
        TextBox1.Text = MyStringBuilder.ToString

処理結果が
  0:  9
 10: 19
 20: 29
 30: 39
 40: 49
 50: 59
 60: 69
 70: 79
 80: 89
 90: 99
100:109
110:119
120:129
130:139
140:149
150:150
・  ・
・  ・
・  ・
とこれの繰り返しで100回くらい(予想)されてしまいます。
これは1回だけ表示に書き換えるには上のコードをどのように書き換えれば
答えがでるのでしょうか?ご教示お願いします。


ガッ  2005-09-08 10:10:08  No: 125016

> とこれの繰り返しで100回くらい(予想)されてしまいます。
> これは1回だけ表示に書き換えるには上のコードをどのように書き換えれば
> 答えがでるのでしょうか?ご教示お願いします。
Aとりあえず、"検索値段(M)" は n のループ中にしか使われておらず、
  しかも値が n と同値なので不必要に見えます。
Bまた M のループは "検索値段()" にしか作用しないループですが、
  Aの理由から "検索値段()" は M のループの内側では変化しないので、
  この M ループも不必要だと思います。
以上から、M によるループは A、n のループから排他してもいいと思います。

…間違ってるかな?


ヤコブ  2005-09-08 10:38:34  No: 125017

ガッさん、言うようにやってみましたがなりません。
僕のやり方が悪いかもしれませんが、
ガさん自身やって見られましたか?
お試しになってみて伝授ください。


ヤコブ  2005-09-08 11:38:47  No: 125018

ちなみに確かめのためにテキストボックスに代入していますが。
最終的には配列の中に
kazu(0) =  0:  9
kazu(1) = 10: 19
kazu(2) = 20: 29
kazu(3) = 30: 39
kazu(4) = 40: 49
 kazu(5) =50: 59
 kazu(6) =60: 69
 kazu(7) =70: 79
 kazu(8) =0: 89
kazu(9) = 90: 99
kazu(10) =100:109
kazu(11) =110:119
kazu(12) =120:129
kazu(13) =130:139
kazu(14) =140:149
kazu(15) =150:150
としたいのですが、それも含めてお教えくだされば、一安心です。


YuO  2005-09-08 11:38:53  No: 125019

> とこれの繰り返しで100回くらい(予想)されてしまいます。
> これは1回だけ表示に書き換えるには上のコードをどのように書き換えれば
> 答えがでるのでしょうか?ご教示お願いします。

そもそも,そういうコードを書いているのですが……。
# (予想)って……。ちゃんと調べていないのか……。

1回分の出力は,一番内側のForループで出力されています。
そして,それがAのループ(16回)×Mのループ(16回)で,256回出力されているはずです。

このコードから,3重ループの意図しているところが読み取れないのですが,
単純にStringBuilderへの出力を3重ループから外し,
3重ループの外側で再度ループを回せばよいのでは?

> お試しになってみて伝授ください。

回答が欲しくないのですか?
この回答も,単にコードを読んだだけで書いた物です。
そのことが気に入らないというのであれば,この回答自体を無視してください。

BBSやMLなどの回答内容を利用したことによって引き起こされる全ての事象についての責任は,回答内容を利用した人が持ってください。
所詮,回答は無償のボランティアによる厚意でしかないのですから。


ヤコブ  2005-09-08 12:10:25  No: 125020

配列を作成したいがためにforを使えば意図したとおりになるのでは
ないのかと思ってこういう形になってしまいました。
配列を上記のように代入するにはどうしたらよろしいのでしょうか?


Geo=TK3  2005-09-08 12:52:16  No: 125021

>僕のやり方が悪いかもしれませんが、
>ガさん自身やって見られましたか?
>お試しになってみて伝授ください。

回答者の方達に実際にコードを試してもらった上での回答が必要ならば
ぜひコンパイル可能なコードを提示してくださいね。
抜けているのが変数宣言程度なら何とかならなくもないですが、関数が
抜けてるのは回答者の方達もどうしようもありませんので。

>配列を作成したいがためにforを使えば意図したとおりになるのでは
>ないのかと思ってこういう形になってしまいました。
>配列を上記のように代入するにはどうしたらよろしいのでしょうか?

一回分の出力を作成している For ループの中で配列に設定していくのが
良いと思います。
ただ公開されているコードから判断する限り、配列のインデックス値と
n の値をともに For 文で変化させるのは難しそうなので、どちらかの値
だけ For 文で変化させ、もう一つの値は自分で逐一計算していく事にな
るでしょう。

とりあえず n の値を For 文で変化させる場合はこんな感じになります。

Dim Idx As Long
Idx = 0
For n = 0 To money Step 10
  kazu(idx) = Partition 〜
  idx = idx + 1
Next


ヤコブ  2005-09-08 13:40:14  No: 125022

>Geo=TK3さん、答えてくださった皆さん♪
どうもありがとうございました見事解決しました♪
助かりました!
またどこかで〜♪♪♪


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加