LINQについて学んだことを備忘録
第1回目は、LINQの概要について
LINQ(リンク)とは?
LINQ(リンク)とは、コレクション(配列やリストなど)やデータテーブルのデータ操作を行える機能です。
具体的には、
- データの選択
- 並べ替え
- 絞り込み
- グループ化
- 重複の削除 …などなど
感覚としては、SQLを使ったデータベース操作に似ています。
LINQを使うメリット
LINQのメリットは、繰り返しを伴う複雑なデータ操作を、LINQを使うことでより簡潔に書くことができ、可読性の向上につながる点です。
しかしながら、単純な処理であれば、UiPathの既存のアクティビティを使ってフローを組んでも可読性が大きく損なわれることもないので、使い所は限られている印象を持っています。
簡単な例として、List = {2,6,1,4,9} から5より大きい数を抽出するフローを考えてみます。
LINQを使わない場合は、下記の画像のような「Listの各要素を繰り返し、5より大きいかどうかを判定し、5より大きければ新たなリストに格納する」といったフローが考えられます。
一方で、LINQを使えば、代入アクティビティの右辺に下記のコードを書けば、5より大きい数だけを抽出してリストに格納することができます。
List.Where(Function(n) n > 5).ToList
このように、これまでは繰り返しといくつかのアクティビティを組み合わせて実装していた処理が、LINQを使えば非常にすっきりとした形で実装できます。
ただし、UiPathには「コレクションをフィルター」のアクティビティが存在します。
それを使えば、リストから5より大きい数を簡単に抽出できます。
そのため、単純な処理の場合は、既存のアクティビティの組み合わせでも可読性が低下しないケースも多くあります。
また、UiPathにおいてはLINQはそれほど一般的ではないと思いますので、非エンジニアや初心者の方がいる現場で使ってしまうと属人化にも繋がり、運用・保守に悪影響を与えてしまうおそれもあります。
そういったことも踏まえたうえで、それでもメリットがあると判断した場合にのみLINQを使うようにしたいです。
LINQの書き方は2種類
LINQには、メソッド構文とクエリ構文という2種類の書き方があります。
メソッド構文(VB)
コレクションに対して行いたい操作を「.」でつなげて記述します。
' Whereで条件に一致する要素のみを抽出
List.Where(Function(n) n > 5).ToList
クエリ構文(VB)
SQLに近い構文で、「From ◯◯ In ×× 行いたい操作 Select △△」といった形で記述します。
' Whereで条件に一致する要素のみを抽出
(From n In List Where n > 5 Select n).ToList
Function(n) や From n の「n」について
ざっくりと説明するなら、この「n」はコレクションの各要素をひとつずつ受け取る変数だと思って下さい。
繰り返しアクティビティの項目名に設定する変数と同じ役割をしています。
また、ここでは例として「n」を使っていますが、「x」や「row」など任意の名前をつけることができます。
これをふまえると、メソッド構文の例で書いたFunction(n) n > 5 の部分は、コレクションの各要素nに対して n > 5 という操作を行う関数ということを表しています。
同様に、クエリ構文のFrom n In List Where n > 5 Select n は、Listの中の要素 n から n > 5 の条件を満たす n を取得するといった意味になります。
言語による書き方の違い
これまでVBのコードでLINQの例をいくつか紹介してきましたが、C#でもLINQを使えます。
ただし、VBとは書き方が若干異なってきます。
UiPathではVBを使うことが多いかと思いますが、調べものをしているとC#で書かれたコードを見る機会もよくありますので、簡単に違いをおさえておきます。
メソッド構文(C#)
メソッド構文では、VBで Function(n) xxx と記述していた部分が、C#では n => xxx という書き方に変わります。
また、メソッドを呼び出す際に「()」を省略するとエラーになります。
// Whereで条件に一致する要素のみを抽出
// ToListの後ろの()を省略するとエラーになる
List.Where(n => n > 5).ToList()
クエリ構文(C#)
クエリ構文では、VBとC#で大きな違いはありませんが、fromやin,where,selectなどの予約語は小文字で記述します。
// Whereで条件に一致する要素のみを抽出
// fromやin,where,selectは小文字で
(from n in List where n > 5 select n).ToList()
次回