【UiPath】データテーブルを配列・リスト・ディクショナリに変換する

# はじめに
UiPathでデータテーブルの特定列を配列やリストやディクショナリーに変換する構文を紹介します。

# 配列に変換
```vb
'検索条件がない場合
dt.AsEnumerable.Select(Function(row) row("ColumnName").ToString).ToArray

'検索条件がある場合(例：空欄の項目を除く)
dt.AsEnumerable.Where(Function(row) row("ColumnName").ToString <> "").Select(Function(row) row("ColumnName").ToString).ToArray

'// 設定項目 //
'dt：変換するデータテーブル
'ColumnName：配列に変換するデータテーブルの列名
```
# リストに変換
```vb
'検索条件がない場合
dt.AsEnumerable.Select(Function(row) row("ColumnName").ToString).ToList

'検索条件がある場合(例：空欄の項目を除く)
dt.AsEnumerable.Where(Function(row) row("ColumnName").ToString <> "").Select(Function(row) row("ColumnName").ToString).ToList

'// 設定項目 //
'dt：変換するデータテーブル
'ColumnName：リストに変換するデータテーブルの列名
```
# ディクショナリーに変換
```vb
'検索条件がない場合
dt.AsEnumerable.ToDictionary(Function(row) row("KeyColumn").ToString, Function(row) row("ValueColumn").ToString)

'検索条件がある場合(例：空欄の項目を除く)
dt.AsEnumerable.Where(Function(row) row("KeyColumn").ToString <> "" AndAlso row("ValueColumn").ToString <> "").ToDictionary(Function(row) row("KeyColumn").ToString, Function(row) row("ValueColumn").ToString)

'// 設定項目 //
'dt：変換するデータテーブル
'KeyColumn：Keyとして使用するデータテーブルの列名
'ValueColumn：Valueとして使用するデータテーブルの列名
```
# データテーブル関連の構文
```vb
'データテーブルを初期化
New DataTable

'データテーブルの構造と値をコピー
dt.Copy

'データテーブルの構造のみコピー
dt.Clone

'データテーブルの列構造を持つ値が空のデータローを作成
dt.NewRow

'データテーブルにデータローを追加
dt.Rows.Add(dr)

'データテーブルに空のデータローを追加
dt.Rows.Add(dt.NewRow)

'データテーブルの行数
dt.RowCount
dt.Rows.Count

'対象列が空欄ではない行数
dt.AsEnumerable.Where(Function(row) row("ColumnName").ToString <> "").Count

'データローの対象列がNullか判定
'　※Int32型やBoolean型への変換前の事前チェックなどで使用
dr.IsNull("ColumnName") 'Null：True、Not Null：False

'データテーブルの列情報を取得
'　※「繰り返し(コレクションの各要素)」アクティビティなどとセットで使用
dt.Columns 'データ型：DataColumnCollection

'データローの列情報を取得
'　※「繰り返し(コレクションの各要素)」アクティビティなどとセットで使用
dr.Table.Columns 'データ型：DataColumnCollection

'データテーブルの列名・データ型を取得
For Each currentColumn In dt.Columns '「繰り返し(コレクションの各要素)」アクティビティに読替

  'カラム名を取得
  Debug.Print currentColumn.ToString
  Debug.Print currentColumn.ColumnName

  'データ型を取得
  Debug.Print currentColumn.DataType.ToString

Next

'データテーブルの列一覧を配列として取得
dt.Columns.Cast(Of DataColumn).Select(Function(x) x.ColumnName).ToArray

'データテーブルの列一覧をリストとして取得
dt.Columns.Cast(Of DataColumn).Select(Function(x) x.ColumnName).ToList

'データテーブルに列を追加
dt.Columns.Add("Column1", Type.GetType("System.Int32"))
dt.Columns.Add("Column2", Type.GetType("System.String"))
dt.Columns.Add("Column3", Type.GetType("System.Boolean"))
dt.Columns.Add("Column4", Type.GetType("System.DateTime"))
```

### 備考　データテーブルを配列に変換する構文の解説
初めてAsEnumerable関数に触れたとき、仕組みがよくわからなかったので、構文の分解をして、理解していました。その際のメモを以下に記載します。
```vb
dt.AsEnumerable.Select(Function(row) row("ColumnName").ToString).ToArray

'// 設定項目 //
'dt：変換するデータテーブル
'row：匿名関数の引数名。「row」や「x」など任意の名称を付けることができます。
'ColumnName：配列に変換するデータテーブルの列名

'// 構文説明 //
'AsEnumerable
'　データテーブルをDataRowオブジェクトのコレクションに変換します。
'　変換前の型：System.Data.DataTable
'　変換後の型：System.Data.EnumerableRowCollection[System.Data.DataRow]

'Select(Function(row) row("ColumnName").ToString)
'　匿名関数(ラムダ式)を使用して、
'　DataRowオブジェクトコレクション（の指定した列の値）を
'　String型のコレクションに変換します。
'
'　変換前の型：System.Data.EnumerableRowCollection[System.Data.DataRow]
'　変換後の型：System.Data.EnumerableRowCollection[System.String]
'
'　詳細
'　DataRowオブジェクトコレクションの各値に
'　Select()の中に記載した匿名関数の処理が行われます。
' 
'　(1) 匿名関数の引数「row」にDataRowオブジェクトを格納
'　(2) 匿名関数の引数「row」に格納したDataRowオブジェクトから指定列の値を取得
'　(3) 指定列の値をObject型からString型に変換

'ToArray
'　String型のコレクションをString型の配列に変換します。
'　変換前の型：System.Data.EnumerableRowCollection[System.String]
'　変換後の型：System.String[]
```