DataRow配列を辞書変数に変換したい

こんばんは
UiPath Studio 2025.0.161 community editionのユーザです。

1.やりたいこと

DataRow配列のarr_DataRowがあります。
arr_DataRowの要素であるDataRowは、例えば{ “06/05/2024 06:16:54”, “Info”, “実行ログ” }の3個のString変数で構成されます。下記がサンプルデータです。

|TimeStamp|Level|Message|
|06/05/2024 06:16:54|Info|Initiation:Started|
|06/05/2024 07:16:56|Info|InputFileExistingCheck:Started|
|06/05/2024 08:16:56|Info|InputFileExistingCheck:Ended|
|06/05/2024 11:16:56|Info|GetAllTransactionData:Started|
|06/05/2024 16:16:58|Info|GetAllTransactionData:Ended|

これをForEachアクティビティでcurrentDataRowでiterateして辞書変数dic_logに変換したいです。
dic_logの変数の型はDictionary<String,Object>で、最初のTimeStampがKeyで、残りのLevel,MessageがValueになります。

2.悩んでいること

自力では作成できませんでした。サンプルコードが作成できる方、ご支援をお願いいたします。

Hi @gorby

If you are using for each use an assign statement

dic_log(currentDataRow("TimeStamp").ToString) = {currentDataRow("Level").ToString, currentDataRow("Message").ToString}

Else if you want to go with linq try this


dic_log = arr_DataRow.ToDictionary(Function(row) row("TimeStamp").ToString, 
                                   Function(row) New Object() {row("Level").ToString, row("Message").ToString})


Hope this helps

まず右辺の型を明確にした方が良いかと思います。Object型ですと任意の型を格納できますので。
仮にdatarowをそのまま格納するのであれば以下になります。

なおログのタイムスタンプは一般的にユニークは保証されませんので(ましてや秒単位レベルならなおさら)、DictionaryのKeyとしてはあまり適当ではないと思います。

ログのTimeStampがユニークで無い場合は、いずれかのキーに上書きされるのでしょうか?それとも動的エラー発生?

代入アクティビティを用いて

dic_log(KEY) = value

とする場合は、上書きされます。

Addメソッドを使用する場合は、例外になります。

Dictionary型変数はDatatableのように何行もデータが積み重なっているイメージですので、正確には格納形式はDataRowではない気がします。Dictionary<String,DataRow>のDataRowは、正しくはDataRow□で格納されている、という認識でよろしいですか?

よろしくないです。
型がDictionary<String,DataRow>であればValueの型はDataRowになります。

何故かDictionary<String,DataRow>と変数を変数パネルで定義しても静的エラーが起きませんが、一般的には、DataRowをDictionary変数に格納する場合、Dictionary<String,DataRow□>が正しいという認識で合ってますか?

一般的とは何を指していますか?
DataRow単体をValueとするのであれば、上記の解釈はあっていません。
DataRow配列をValueとするのであれば、Dictionary<String,DataRow[]>になります。