Integerの配列に (例として)FormのWidthプロパティの値を代入 への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 bz9  (中学生)
投稿日時
2012/5/3 10:35:05
解決チェック忘れてました
投稿者 bz9  (中学生)
投稿日時
2012/5/3 10:34:17
魔界の仮面弁士さんへ
> > と(まぁ 意味のない)コードがあったとして
> そもそも二番目の宣言は、(たとえ変数名を変えても)文法エラーになりますよね。
あ・・・ 配列に Newはできませんでしたね^^;
>最終的にやりたいことは何ですか?
やりたかったのは (c)です。
> > ループを使わずに代入したいのですが
> ループを使いたくない理由は何ですか?
ゲームを作っていて ループを使うと速度が遅くなってしまうからで
ループ以外の方法があるのかわからなかったからです
うまく説明できなかったのでFormを使ったということです。
shuさんへ
再帰を利用する方法も使ってみようと思います
再帰はあまり使わないので考えていませんでした
ありがとうございました。
> > と(まぁ 意味のない)コードがあったとして
> そもそも二番目の宣言は、(たとえ変数名を変えても)文法エラーになりますよね。
あ・・・ 配列に Newはできませんでしたね^^;
>最終的にやりたいことは何ですか?
やりたかったのは (c)です。
> > ループを使わずに代入したいのですが
> ループを使いたくない理由は何ですか?
ゲームを作っていて ループを使うと速度が遅くなってしまうからで
ループ以外の方法があるのかわからなかったからです
うまく説明できなかったのでFormを使ったということです。
shuさんへ
再帰を利用する方法も使ってみようと思います
再帰はあまり使わないので考えていませんでした
ありがとうございました。
投稿者 shu  (社会人)
投稿日時
2012/5/2 23:22:23
再帰を利用する方法
要素数増えると大変です。
要素数増えると大変です。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim fm() As Form = {Form2, Form3, Form4}
Dim w(fm.Length - 1) As Integer
SetWidth(fm, w, 0)
End Sub
Private Sub SetWidth(ByVal fm() As Form, ByVal w() As Integer, ByVal index As Integer)
If index < fm.Length Then
w(index) = fm(index).Width
SetWidth(fm, w, index + 1)
End If
End Sub
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2012/5/2 21:58:20
極力、元の変数宣言に合わせてみました。
これが「やりたいこと」に合致しているかどうかは分かりませんが…。
Dim Form() As Form = Enumerable.Range(1, 5).Select( _
Function(n) New Form() With {.Text = "Form" & CStr(n)}).ToArray()
Dim Int() As Integer = Form.Select(Function(f) f.Width).ToArray()
これが「やりたいこと」に合致しているかどうかは分かりませんが…。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2012/5/2 21:41:00
> Dim Int(5) As Integer
> Dim Form(5) As New Form
「Int関数」や「Formクラス」と名前が競合しているので、変数名を見直すことをお奨めします。
(不正な変数名というわけでは無いので、使えないわけでは無いのですけれども)
> と(まぁ 意味のない)コードがあったとして
そもそも二番目の宣言は、(たとえ変数名を変えても)文法エラーになりますよね。
最終的にやりたいことは何ですか?
(a) Form インスタンスを 1 つ作り、それを要素数 5 の一次元配列変数に格納する。
(b) Form インスタンスを 5 つ作り、それを要素数 5 の一次元配列変数に格納する。
(c) Form の配列は既にあるものとして、そこからそれぞれの Width を抜き出した配列を作る。
> ループを使わずに代入したいのですが
ループを使いたくない理由は何ですか?
> ここまで読んでも なんのことかよくわからないですよね・・・
とりあえず上記(c) なら:
> Dim Form(5) As New Form
「Int関数」や「Formクラス」と名前が競合しているので、変数名を見直すことをお奨めします。
(不正な変数名というわけでは無いので、使えないわけでは無いのですけれども)
> と(まぁ 意味のない)コードがあったとして
そもそも二番目の宣言は、(たとえ変数名を変えても)文法エラーになりますよね。
最終的にやりたいことは何ですか?
(a) Form インスタンスを 1 つ作り、それを要素数 5 の一次元配列変数に格納する。
(b) Form インスタンスを 5 つ作り、それを要素数 5 の一次元配列変数に格納する。
(c) Form の配列は既にあるものとして、そこからそれぞれの Width を抜き出した配列を作る。
> ループを使わずに代入したいのですが
ループを使いたくない理由は何ですか?
> ここまで読んでも なんのことかよくわからないですよね・・・
とりあえず上記(c) なら:
Dim I() As Integer = フォーム配列.Select(Function(f) f.Width).ToArray()
投稿者 bz9  (中学生)
投稿日時
2012/5/2 20:45:15
題名みても なんのことかよくわからないですよね^^;
例えば
Int配列に FormのWidthプロパティの値を出来ればループを使わずに代入したいのですが
Googleでいろいろ調べてみているのですが全くわかりません
ループを使えば すぐできるのですが・・・
ここまで読んでも なんのことかよくわからないですよね・・・
例えば
Dim Int(5) As Integer
Dim Form(5) As New Form
と(まぁ 意味のない)コードがあったとしてInt配列に FormのWidthプロパティの値を出来ればループを使わずに代入したいのですが
Googleでいろいろ調べてみているのですが全くわかりません
ループを使えば すぐできるのですが・・・
ここまで読んでも なんのことかよくわからないですよね・・・
LINQは内部的にループを使いますし,再帰はループより大抵遅くなります。
まずは本当に対象のループが問題であるのかを計測によって調べ,
本当に速度が問題であれば
・ループ中での不要な処理を避ける
・データ構造を速度が出るように変える
などの処置をするのがよいかと思います。