tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルdataTable 2 配列
記事No11089
投稿日: 2013/06/13(Thu) 09:06
投稿者ルトケ
VB6は長いけどドットネットは初心者のウィンドウズ7使いです!
データテーブル便利だけどあとで四則演算とかやりたいときは配列
に落としこみたいということで以下のようなコードを
書いてみたが、データテーブル→ジェネリック列挙体→配列
ということでステップが過多な気がします。なんか
良い方法ありませんか。VB2010にアップデートしてLINQ?

     Dim dt As New DataTable
      dt.Columns.Add()
        dt.Columns.Add()

        dt.Rows.Add(0, 2)
        dt.Rows.Add(1, 3)
        dt.Rows.Add(2, 6)

        Dim numbers As New List(Of Integer)

        For Each row As DataRow In dt.Rows
            numbers.Add(row(1))
        Next

        Dim arr As Integer()

        arr = numbers.ToArray()

        With ComboBox1
            For i As Integer = 0 To 2
                .Items.Add(arr(i))
            Next
        End With

[ツリー表示へ]
タイトルRe: dataTable 2 配列
記事No11090
投稿日: 2013/06/13(Thu) 10:54
投稿者shu
文章で書いてあることと提示コードの
違いがあるためやりたいことがよくわかりませんが

提示コードの内容は
ComboBox1.DataSource = new Integer() {2, 3, 6}

だけで実現出来てしまうので
もう少し意図することが分かるようお願いします。


DataTableを使用した方法でも

    Dim dt As New DataTable
    dt.Columns.Add("col1", GetType(Integer))
    dt.Columns.Add("col2", GetType(Integer))

    dt.Rows.Add(0, 2)
    dt.Rows.Add(1, 3)
    dt.Rows.Add(2, 6)

    ComboBox1.DataSource = dt
    ComboBox1.DisplayMember = "col2"

このようなコードで実現出来ます。

[ツリー表示へ]
タイトルRe^2: dataTable 2 配列
記事No11091
投稿日: 2013/06/13(Thu) 15:14
投稿者ルトケ
ありがとうございました。すみません。説明不足でした。

配列に変換した後、「各要素の平均」を
求めたいです。コードで書くと以下のようになると思います。

    Dim dt As New DataTable
    dt.Columns.Add()
    dt.Columns.Add()

    dt.Rows.Add(0, 2)
    dt.Rows.Add(1, 3)
    dt.Rows.Add(2, 6)

    Dim numbers As New List(Of Integer)

    For Each row As DataRow In dt.Rows
       numbers.Add(row(1))
    Next

    Dim arr As Integer()
    arr = numbers.ToArray()
    Dim result as Single
    For i = 0 as Integer to 2 step 1
     result += numbers(i)
    Next i

    MsgBox("average: " & CStr(result/3))

dataTableのRowとか列挙体だと 要素の足し算の仕方が
わかりません。馴染みのある配列に変換してから
足し算にもちこまねば・・と考え上のようなコードを
ものしました。よろしくお願いします。

> 文章で書いてあることと提示コードの
> 違いがあるためやりたいことがよくわかりませんが
>
> 提示コードの内容は
> ComboBox1.DataSource = new Integer() {2, 3, 6}
>
> だけで実現出来てしまうので
> もう少し意図することが分かるようお願いします。
>
>
> DataTableを使用した方法でも
>
>     Dim dt As New DataTable
>     dt.Columns.Add("col1", GetType(Integer))
>     dt.Columns.Add("col2", GetType(Integer))
>
>     dt.Rows.Add(0, 2)
>     dt.Rows.Add(1, 3)
>     dt.Rows.Add(2, 6)
>
>     ComboBox1.DataSource = dt
>     ComboBox1.DisplayMember = "col2"
>
> このようなコードで実現出来ます。

[ツリー表示へ]
タイトルRe^3: dataTable 2 配列
記事No11092
投稿日: 2013/06/14(Fri) 04:35
投稿者YuO
えーっと,列挙体と呼んでいるのはList(Of T)のことですよね。
これは列挙体とは呼びません。
あえて呼ぶならリストです。
列挙体と言われると,Enumの方が想像されます。

> 配列に変換した後、「各要素の平均」を
> 求めたいです。コードで書くと以下のようになると思います。

書かれているコードは,「配列の各要素の平均」を求めておらず,
「リストの各要素の平均」を求めていることに気づいているでしょうか。

>     Dim arr As Integer()
>     arr = numbers.ToArray()
>     Dim result as Single
>     For i = 0 as Integer to 2 step 1
>      result += numbers(i)
>     Next i

resultへの追加がarr(i)ではなくnumbers(i)になっています。
resultはList(Of Integer)なので,配列であるarrを使っていません。
コードはこのままで動くはずです。

List(Of T)は「可変長配列」です。
各要素へのアクセスは括弧を使って配列と同じように行えます。
LengthプロパティがCountプロパティになるあたりのみ気をつければ,
List(Of T)を配列の代わりに使えると思います。

[ツリー表示へ]
タイトルRe^4: dataTable 2 配列
記事No11093
投稿日: 2013/06/14(Fri) 07:20
投稿者ルトケ
ありがとうございます。arr+=やるつもりがまちがって
+= numbers(i)
でした。あとからVB2005でデバッグ実行やってみます。


>
> > 配列に変換した後、「各要素の平均」を
> > 求めたいです。コードで書くと以下のようになると思います。
>
> 書かれているコードは,「配列の各要素の平均」を求めておらず,
> 「リストの各要素の平均」を求めていることに気づいているでしょうか。
>
> >     Dim arr As Integer()
> >     arr = numbers.ToArray()
> >     Dim result as Single
> >     For i = 0 as Integer to 2 step 1
> >      result += numbers(i)
> >     Next i
>
> resultへの追加がarr(i)ではなくnumbers(i)になっています。
> resultはList(Of Integer)なので,配列であるarrを使っていません。
> コードはこのままで動くはずです。
>
> List(Of T)は「可変長配列」です。
> 各要素へのアクセスは括弧を使って配列と同じように行えます。
> LengthプロパティがCountプロパティになるあたりのみ気をつければ,
> List(Of T)を配列の代わりに使えると思います。

[ツリー表示へ]
タイトルRe^5: dataTable 2 配列
記事No11094
投稿日: 2013/06/14(Fri) 08:19
投稿者ルトケ
ありがとうございます。自己レスです。以下のコードで
走りました。

        Dim dt As New DataTable
        dt.Columns.Add(): dt.Columns.Add()

        dt.Rows.Add(0, 2): dt.Rows.Add(1, 3):dt.Rows.Add(2, 6)

        Dim numbers As New List(Of Integer)

        For Each row As DataRow In dt.Rows
            numbers.Add(row(1))
        Next

        Dim result As Single, i As Integer
        For i = 0 To 2 Step 1
            result += numbers(i)
        Next i
        MsgBox("average: " & CStr(result / 3))

[ツリー表示へ]
タイトルRe^3: dataTable 2 配列
記事No11095
投稿日: 2013/06/17(Mon) 10:16
投稿者魔界の仮面弁士
> 配列に変換した後、「各要素の平均」を
> 求めたいです。コードで書くと以下のようになると思います。

平均を得るだけならば、DataTable 単体でも行えますよ。


'---「Compute メソッド」を使う方法
Dim dt As New DataTable()

'文字列だと平均を得られないので、実数型として定義しておく
dt.Columns.Add("COL1", GetType(Decimal))
dt.Columns.Add("COL2", GetType(Decimal))

dt.Rows.Add(0, 2)
dt.Rows.Add(1, 3)
dt.Rows.Add(2, 6)

MsgBox("Average: " & CStr(dt.Compute("AVG(COL2)", "")))


'---「式列」を使う方法
Dim dt As New DataTable()

'文字列だと平均を得られないので、実数型にしておく
dt.Columns.Add("COL1", GetType(Double))
dt.Columns.Add("COL2", GetType(Double))

dt.Rows.Add(0, 2)
dt.Rows.Add(1, 3)
dt.Rows.Add(2, 6)

dt.Columns.Add("Col2Avg", GetType(Double), "AVG(COL2)")

MsgBox("Average: " & CStr(dt.Rows(0)("Col2Avg")))


'--- 元の DataTable の定義を変更したくない場合
Dim dt As New DataTable()
dt.Columns.Add()
dt.Columns.Add()

dt.Rows.Add(0, 2)
dt.Rows.Add(1, 3)
dt.Rows.Add(2, 6)

'一時的に、実数型に変換するための「式列」を用意する
dt.Columns.Add("Column3", GetType(Single), "CONVERT(Column2, 'System.Single')")
'Computeメソッドで集計する
MsgBox("Average: " & CStr(dt.Compute("AVG(Column3)", "")))
'一時列を削除して元に戻す
dt.Columns.Remove(dt.Columns("Column3"))
'--------------------------------


> VB2010にアップデートしてLINQ?
Linq は 2008 から使えますし、最新版は 2012 ですが
あえてその中間をとっての 2010 選択でしょうか。


# Visual Studio 2013 の足音も聞こえてきたようで。
# http://softwareengineeringplatform.com/articles/visual-studio-2013-at-teched-2013/

[ツリー表示へ]
タイトルRe^4: dataTable 2 配列
記事No11096
投稿日: 2013/06/19(Wed) 09:20
投稿者ルトケ
魔法の仮面弁士さま

どうもありがとうございました。
早速デバッグしてみます

[ツリー表示へ]