Dictionaryを使ってみる

  Collection Manipulation

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

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

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

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

方法

コードステージを使い、コレクションをDictionaryに変換後、指定したKeyに紐つくValueを取り出すロジックを記述します。

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

出力

resultはFlag型で、取得が成功した場合はTrue、失敗した場合はFalseを返します。

image.png

ソースコード

image.png

InitialiseにImport追加

Namespace ImportsにSystem.Collections.Genericを追加します。
これがないと、コードステージでDictionary型の変数宣言でコンパイルエラーになります。

image.png

パフォーマンス検証

FilterCollection ⇒ Read Collection Fieldの方法Dictionaryを使う方法、どちらが早いのか検証します。

事前準備として、Excelに50000行のレコードを用意します。
列名は「列1」「列2」とします。(列1:Key 列2:Value)

image.png

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

FilterCollection ⇒ Read Collection Fieldの場合

image.png

アクション:絞り込み

image.png
image.png

アクション:値取得

image.png
image.png

動かしてみる

デバッグスピードは標準

Dictonary変換 ⇒ Keyに紐つくValue取得の場合

image.png

動かしてみる

デバッグスピードは標準

結果

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

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

LEAVE A COMMENT

CAPTCHA