読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

LINQ小手調べ【Unity】【LINQ】

Unity LINQ

このエントリーをはてなブックマークに追加

使ってみたいなーと思っていたLINQを使い始めたので、まずは小手調べに記事を一本!


LINQとは

そもそもLINQとはなんぞや?からですが、

Linqとは
.Net Framework上の「言語に統合されたクエリ」(Language-INtegrated Query)の拡張セットを指すコードネームの名称。

Linq とは


なるほど、わからん。

とりあえずなんの略称かは分かりました。

後、リンキューじゃなくてリンクって読むんですね、はい。

次!

配列等に対してSQLのように宣言的にクエリ(フィルタや射影)が書ける


これなら何となく無く分かる気が…!

ようは、配列等をforeachで回してifで条件を判定しなくとも、LINQメソッドで一発!みたいな話ですね。


また、LINQにはLinq to ObjectsやらLinq to DataSetやら色々あるみたいです。

IEnumeable を実装するコレクションクラスに対するもの(LINQ to Object)や、 XML に対するもの(LINQ to XML)、 それに、リレーショナルデータベースサーバに対する SQL クエリを生成するもの(LINQ to SQL)などがあります。

LINQ (C# によるプログラミング入門)


とりあえず使うのはLinq to Objectsの事でいいみたい…?


LINQの使い方

まずは下準備として以下の記載をします。

using System.Linq;


肝心のLINQの使い方ですが、クエリ式とメソッド式の2種類があるそうです。

クエリ式: var q = from x in collection where x > 10 select x * x;
メソッド形式で LINQ: var q = collection.Where(x => x > 10).Select(x => x * x);

LINQ (C# によるプログラミング入門)


クエリ式がSQLっぽい書き方で、メソッド式はその名の通りメソッドを実行する感じですね。

メソッド式のが良く見るし、見易いのでとりあえずこっちで書く事にしました。


ここで気になるのがどんなメソッドがあって、どんな事が出来るの?ってことですが、

良記事を発見したのでこちらをご紹介。




上の記事はメソッド名だけでなく、サンプル&画像付きなので、初学の状態でも概要が掴めてGood!

下の記事もサンプル付きかつ簡潔にまとまっているので、一覧から探すのに有効そう!


LINQの利点

foreach使わなくても条件にあったの取れるよー

コードも短くなるよー見易くなるよー

みたいな事はなんとなく分かったのですが、

使ってみてなるほど、これは見易いというのが理解しました。

以下に例を挙げてみます。

// assetsとtargetDirectoryNameListはList<string>型
bool exists = false;

//(1) LINQ未使用
foreach (string asset in assets) {

  string directoryName = System.IO.Path.GetDirectoryName (asset);

    foreach (string targetDirectoryName in targetDirectoryNameList) {

      if(directoryName == targetDirectoryName){
        exists = true;
      }

    }

}

//(2) LINQ使用
exists = assets                      
    .Select (asset => System.IO.Path.GetDirectoryName (asset))   
    .Intersect (targetDirectoryNameList)                         
    .Count () > 0;                                              


細かい説明は省きますが、目的はexistsがtrueかfalseかってことで(1)も(2)も同じ事をしています。


(1)の場合、ネストが深くなっている時点で読み難いし、

foreachが重なっているためにコメント無しでは何をしているのかをすぐに判断するのは難しいです。


(2)の場合だと「SelectしてIntersectしたCountが0より大きい」

LINQが分かれば、難なく読み解けるような気がしないでもない!


このように、メソッド式のLINQだと数珠繋ぎで書かれるために読み進め易く、

各メソッドの引数を見ずとも概要が掴めるため、理解し易いのではないかと思いました。



LINQの問題点

こんなに便利で使い勝手が良さそうなLINQが、

Unityではいまいち普及していないのにはもちろん理由があります。



上記の通り、LINQを使ったアプリをiOSに書き出した時、

エラーが発生する場合があるからです。


エラーが発生しないものだけを使えばいい感じはしますが、全て把握するのは困難ですし、

バグの原因を減らせるならと、今まで敬遠していました。


そんなLINQをなぜ使い始めたかと言うと、iOS上では実行されないコード、

つまりUnity上でしか実行されないエディタ拡張なら問題ないじゃないか!

という事に今更ながらに気付いたためです。


例えば以下の記事で書いたエディタ拡張もUnity上でしか実行されません。(LINQはまだ使っていない)



これで、Unity+LINQ+iOSが問題なく動くその日まで、エディタ拡張周りで勉強できますね!


Unity+LINQのライブラリ

まだ使った事はないのですが、

実はUnity+iOSでも動作するライブラリ(ベータ版)が既に作られていたりします。



そのうち使うかもしれない!

使わないかもしれない!