【BluePrism】Dictionaryを使ってみる

UiPathでExcelファイルを読み込む際にDictionaryに格納してKeyに紐つくValueを引っ張ってきて…
っていうのをよくやっていました。
が、BluePrismではDictionary型の変数（Data Item）は使えません。

BPでは配列＝コレクションなのですが、コレクションの指定行の指定列の値を取り出したい場面に遭遇することは多々あると思います。

その度にFilter CollectionしてRead Collection Fieldするのはちょっと面倒。
パフォーマンス的にもちょっと心配。

というわけで、Dictionaryを使って何とか実現できないかやってみました。

##方法
コードステージを使い、**コレクションをDictionaryに変換後、指定したKeyに紐つくValueを取り出す**ロジックを記述します。
今回は実験なので、ソースは雑ですｗ

```vb:sample
Dim dic As New Dictionary(Of Integer, String)()
Try
	For Each row as DataRow in data.Rows
		Dim val1 as String = CStr(row(0))
		Dim val2 as String = CStr(row(1))
		dic.Add(val1, val2)
	Next
Catch ex As System.Exception
	result = False
    dic = Nothing
	Return
End Try

result = True
outputValue = dic(inputValue)
```

###入力
inputValueにはDictionaryのKeyを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/4c3e0d99-d744-0fe5-616a-466cb79e8ecb.png)

###出力
resultはFlag型で、取得が成功した場合はTrue、失敗した場合はFalseを返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/c1517991-d4b0-5147-4bb0-d74720f61287.png)

###ソースコード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/4fa3d14e-8530-7a85-06f5-dfefb274cda0.png)

###InitialiseにImport追加
Namespace Importsに**System.Collections.Generic**を追加します。
これがないと、コードステージでDictionary型の変数宣言でコンパイルエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/8a20b46b-65ba-4c31-192c-699398223d39.png)

##パフォーマンス検証
**FilterCollection ⇒ Read Collection Fieldの方法**と**Dictionaryを使う方法**、どちらが早いのか検証します。

事前準備として、Excelに50000行のレコードを用意します。
列名は「列1」「列2」とします。（列1：Key　列2：Value）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/4795a8f2-8c42-bc0b-2ef9-2aca091a0a83.png)

Excelから50000行のレコードを読み込み、コレクションに格納。
ここまで準備できたらさっそく検証です。

###FilterCollection ⇒ Read Collection Fieldの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/e9fe0b44-1efd-ed46-56ab-226dd2a653d9.png)

###アクション：絞り込み
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/25462169-2ff1-bac8-4ee6-f61af2c1a28d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/aeeacd73-7ada-fae6-17f9-4e0dc5af1a64.png)

###アクション：値取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/9d595fb9-6990-a3ec-393a-4ccc1caea386.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/9905241c-50f2-d87b-7283-da0e319e45b2.png)

####動かしてみる
デバッグスピードは標準
![test1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/79fee486-e985-14a9-8c73-3c931b09e508.gif)

###Dictonary変換 ⇒ Keyに紐つくValue取得の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/959bcc47-22da-6a5b-bb00-00a4d08dfed5.png)

####動かしてみる
デバッグスピードは標準
![test2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/51bc4a97-07b3-1267-0a8b-5f5048c3e265.gif)


##結果
50000行のレコードではそれほどスピードに大差はありませんでした。
Dictionary使うもよし、コレクションを絞り込むもよし。

ただ、コレクション絞り込みの方法だと
単純にアクション数が増えてしまうのと、inputの設定が多少面倒なので
Dictionaryを使うメリットはあるかなーと思います。
少しだけDictionary使ったほうが早い気もしますし。。。

今回はコードステージでやってしまいましたが、使う際はちゃんとオブジェクト化しましょう。

##余談
取得レコード数が2000～3000行程度でも、**Get Worksheet as Collection Offset**が固まる。