前回の記事では、繰り返しの処理としてfor文を利用しました。
https://qiita.com/HiHiroyoshi/items/24e7d0e0cfdade21c8be
今回は、for each文について取り上げます。
要素数が不明な場合、全要素に対して処理を行いたい場合に利用します。
今回は、新たにDataTableというもの(Object)を扱います。
配列(Array)は、同じ型(Integer:整数やString:文字列)でないと、使えないといった制約があります。
ですが、DataTableでは、列(Column:カラム)ごとにデータ型を宣言することができます。
DataTableのイメージ
Integer(整数) | String(文字列) | String(文字列2) |
---|---|---|
1 | A | Test |
配列のイメージ
添え字 | 0 | 1 | 2 |
---|---|---|---|
値 | 3 | 5 | 7 |
といった具合です。
for each文を使うメリットの一つが読みやすさ(可読性)です。
まずは、値を格納しましょう。
下準備をします。
DataTableを生成して、カラム(列)を定義して、
4行ほどのサンプルデータを入れてみます。
'配列を用意
Dim array1() As String = {"Alice", "Bob", "Caroll", "Daisy"}
Dim array2() As String = {"USA", "Canada", "UK", "Japan"}
Dim dataTable1 As New DataTable
'列の追加
dataTable1.Columns.Add("No", GetType(Integer))
dataTable1.Columns.Add("Name", GetType(String))
dataTable1.Columns.Add("Address", GetType(String))
For i = 0 To 3
Dim dr As DataRow = dataTable1.Rows.Add()
dr("No") = i + 1
dr("Name") = array1(i)
dr("Address") = array2(i)
Next i
これを実行すると、dataTable1に下記のデータが作成されます。
手入力の場合、カラム名には気を付けましょう。
○ No
× NO
○ Address
× Adress
こういった場合、DataTable内に列NOは、テーブルに属していません。
といったメッセージが表示されます。
NoがInteger,NameがString、AddressがStringといった型の具合です。
これが下準備です。
さて、このDataTableに対して、for each文を行ってみましょう。
Datatable(dataTable1)のrow(行)をdatarowとして、dataTable2にデータを置きかえてみます。
Dim array1() As String = {"Alice", "Bob", "Caroll", "Daisy"}
Dim array2() As String = {"USA", "Canada", "UK", "Japan"}
Dim dataTable1 As New DataTable
dataTable1.Columns.Add("No", GetType(Integer))
dataTable1.Columns.Add("Name", GetType(String))
dataTable1.Columns.Add("Address", GetType(String))
For i = 0 To 3
Dim dr As DataRow = dataTable1.Rows.Add()
dr("No") = i + 1
dr("Name") = array1(i)
dr("Address") = array2(i)
Next i
Dim dataTable2 As New DataTable
dataTable2.Columns.Add("No", GetType(Integer))
dataTable2.Columns.Add("Name", GetType(String))
dataTable2.Columns.Add("Address", GetType(String))
For Each dr As DataRow In dataTable1.Rows
Dim dr2 As DataRow = dataTable2.Rows.Add()
dr2("No") = dr("No")
dr2("Name") = dr("Name")
dr2("Address") = dr("Address")
Next dr
dataTable1をdataTable2に置き換えただけなので、cloneメソッドを使えば一発だと思われた方もいるかと思いますが、For Each 文に関して述べさせていただくためのサンプルということで......
まとめ
For文は、For Each文を利用することも可能です。
For Eachを利用して全要素に対して処理を行うことで比較的に読みやすいコードを書くことが可能です。