Integerの配列に (例として)FormのWidthプロパティの値を代入

タグの編集
投稿者 bz9  (中学生) 投稿日時 2012/5/2 20:45:15
題名みても なんのことかよくわからないですよね^^;

例えば
Dim Int(5) As Integer
Dim Form(5) As New Form
と(まぁ 意味のない)コードがあったとして

Int配列に FormのWidthプロパティの値を出来ればループを使わずに代入したいのですが
Googleでいろいろ調べてみているのですが全くわかりません

ループを使えば すぐできるのですが・・・

ここまで読んでも なんのことかよくわからないですよね・・・
投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 I() As Integer = フォーム配列.Select(Function(f) f.Width).ToArray()
投稿者 魔界の仮面弁士  (社会人) 投稿日時 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()


これが「やりたいこと」に合致しているかどうかは分かりませんが…。
投稿者 shu  (社会人) 投稿日時 2012/5/2 23:22:23
再帰を利用する方法
要素数増えると大変です。

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal 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 IntegerByVal index As Integer)
        If index < fm.Length Then
            w(index) = fm(index).Width
            SetWidth(fm, w, index + 1)
        End If
    End Sub

投稿者 bz9  (中学生) 投稿日時 2012/5/3 10:34:17
魔界の仮面弁士さんへ

> > と(まぁ 意味のない)コードがあったとして
> そもそも二番目の宣言は、(たとえ変数名を変えても)文法エラーになりますよね。

あ・・・ 配列に Newはできませんでしたね^^;

>最終的にやりたいことは何ですか?
やりたかったのは (c)です。

> > ループを使わずに代入したいのですが
> ループを使いたくない理由は何ですか?

ゲームを作っていて ループを使うと速度が遅くなってしまうからで
ループ以外の方法があるのかわからなかったからです

うまく説明できなかったのでFormを使ったということです。


shuさんへ

再帰を利用する方法も使ってみようと思います
再帰はあまり使わないので考えていませんでした


ありがとうございました。
投稿者 bz9  (中学生) 投稿日時 2012/5/3 10:35:05
解決チェック忘れてました
投稿者 YuO  (社会人) 投稿日時 2012/5/4 01:42:04
解決となっていますが……。


LINQは内部的にループを使いますし,再帰はループより大抵遅くなります。

まずは本当に対象のループが問題であるのかを計測によって調べ,
本当に速度が問題であれば
・ループ中での不要な処理を避ける
・データ構造を速度が出るように変える
などの処置をするのがよいかと思います。