Collection（配列、リスト）に触ってみる

## はじめに
この記事は、[[RPA] UiPath Friends 公式 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/uipathfriends)　3日目の投稿です。
イベントごとが無ければついついアウトプットをためらってしまう私には、非常にありがたい企画。
どうせやるなら早い日程に！と思いつつ、土日に書ききれず、慌てて書き上げているのは内緒です。

## テーマ
タイトル通り、Collectionに分類される型について、いくつか触れてみたいと思います。
とは言え、[ガチで触れると大変](https://docs.microsoft.com/ja-jp/dotnet/standard/collections/commonly-used-collection-types)なので、対象は Array,List\<T>, ~~Dictionary\<TKey,TValue>~~ の2種類に絞ります。
(3種類にする予定でしたが、夜が明けそうなので、次の機会に…)

私も初めてUiPathでFor Eachに触った時は、試行錯誤したなぁとか思い出しつつ、
何番煎じになるか分かりませんが、開発で良く使うであろう内容を、書いていきます。

## 使用環境
Studio 2020.10.0-beta.1145 - 10/12/2020
Community License
Microsoft Windows 10 Home 64-bit
.NET Framework Version 4.8
言語：日本語

## Array(配列型)
{A,B,C}といった形で、複数の要素を格納できる凄いやつ。その1。
※中に入っている値は 要素 と呼びます
UiPathで「フォルダ内のファイル数分の繰り返しをやりたい」といった際に、
いきなり出てきて初心者の心を折りにきます。

例えば下記のような構成で、「家計簿_2019」フォルダに格納されているファイルのを1つずつ開いて処理したい場合。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/4c179e2c-3cc8-2526-4f91-e69c838fd854.png)
For Each(繰り返し(コレクションの各要素))の値に下記のような書き方をします。
`Directory.GetFiles("家計簿_2019")`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/9765181e-6553-7e23-a8aa-0afda013f4a8.png)
この時、`Directory.GetFiles()`の返り値となっているのが、各ファイルのパスが格納されたArray(配列型)の変数になります。
ローカルパネルを覗くと、1年分12個のファイルパスが格納されている事が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/1710213b-3837-2605-1021-b2982a1c4b42.png)
あとは取得されたファイルのパスを使って、データを読み取るなり、ファイルを移動するなり、自由自在です。便利！
ですが、Array(配列型)の変数には弱点があります。

それは、、、

一度、作成されてしまうと、中に格納している要素を増やすことができません。
上記の例だと、処理対象に2019年の家計簿ファイルだけでなく、2020年の家計簿ファイルを加えたい時に対応できません。

ではどうするかと言うと・・・
## List\<T>(リスト型)
複数の要素を格納できる凄いやつ。その2。
格納する要素の数を後から増やせます。
その代わり、変数の規定値に初期化の設定を入力する必要があったり、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/6bb037aa-e83e-f607-a099-bef2bda270cd.png)
型の選択が少し大変だったりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/74a75f6e-af97-83ce-b117-d202648d864c.png)
要素の追加をする為には Add という名前のメソッドを使用しますが、UiPathには対応したアクティビティが存在します。
その名もずばりAdd Collection(コレクションに追加)です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/5a1477bb-98c4-b109-27ff-7f00e33d96f2.png)
###複数の配列からひとつのリストへ
For Each(繰り返し(コレクションの各要素))と組み合わせることで、簡単に配列からリストへ中身を移す事ができます。
For Each(繰り返し(コレクションの各要素))の値にはそれぞれ
`Directory.GetFiles("家計簿_2019")`と`Directory.GetFiles("家計簿_2020")`が設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/4b973d48-6b57-8a59-e0db-fc39e588595f.png)
それぞれの繰り返しの中で、各年の家計簿ファイルのパスがリスト型の変数に格納されていくことで、
最終的に2か所のフォルダに格納されていたファイルのパスが、ひとつの変数の中に集約されたことになります。
ローカルパネルで変数の中身を覗いてみると、2019年ファイルのパスと2020年ファイルのパスが含まれた状態で2年分24個のファイルパスが格納されていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/d5230703-2e1b-d56d-13f8-4e4a2c2f5cde.png)
###配列からリストへ移し替えるだけなら
Assign(代入)を使って簡単に実現する事ができます。
左辺にはリスト型の変数を設定します。
右辺に配列型の変数を設定し`.ToList`と付け加えます。
`.ToString`のように、書き添えるだけで型変換ができるので、非常に簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545766/30a380be-f7de-7212-611f-1cb384df1f4b.png)

ただし、この書き方では単純にリストの中身を上書きしてしまいます。
複数の配列からひとつのリストへ値をまとめることが出来ないので注意が必要です。

## さいごに
以上で2020年2度目のアウトプットはおしまいです。
繰り返しって何？配列？リスト？？となっていた初心者の自分を思い出しつつ、書いてみました。
誰かの役に立てば幸いです。

2020年は[UiPathFriends](https://uipath-friends.doorkeeper.jp/)の運営に参加した事で、いろいろな初めましての縁があった年でした。
夏の企画で書いた初記事も、400View近くになっていて、とても驚いています。

この記事で書くつもりだった残りの型 Dictionary\<TKey,TValue> については次の企画でがんばってみます。
対象フォルダのパスが変わる場合は？対象フォルダの数が増減する場合は？
といったケースへの対応策として、Dictionary型で設定値を読み込んで使ってみる。というケースを書いてみたいと思います。

最後までお読みいただき、ありがとうございました。