LINQ


C#ではLINQという機能がありますがよく知らなかったので試してみました。
基本的にはSQLを文字列ではなく言語の持つ機能として作られたものがLINQ(統合言語クエリ)というもののようです。
Unityでは直接DBを扱う事というよりはコレクションを操作して別のコレクションを作るときに使えます。
例えばGameObjectのコレクションの中からposition.x > 0のものだけを選ぶ場合。
[unitycsharp]
List<GameObject> gameObjects = new List<GameObject>();

for (int i = 0; i < 10; ++i) {
GameObject go = GameObject.CreatePrimitive(PrimitiveType.Cube);
go.name = "GameObject" + i.ToString();
gameObjects.Add(go);
go.transform.position = new Vector3(Random.Range(0, 10), Random.Range(0, 10), Random.Range(0, 10));
}

foreach (GameObject go in gameObjects.Where(go => go.transform.position.x > 0)) {
go.renderer.material.color = Color.red;
}
[/unitycsharp]

x座標でソートするには
[unitycsharp]
foreach (GameObject go in gameObjects.OrderBy(go => go.transform.position.x)) {
print(go.name + ".x => " + go.transform.position);
}
[/unitycsharp]
x座標でソートしつつ、値が重なった場合にはy座標でソートしたい場合には
[unitycsharp]
foreach (GameObject go in gameObjects.OrderBy(go => go.transform.position.x).ThenBy(go => go.transform.position.y)) {
print(go.name + ".x => " + go.transform.position);
}
[/unitycsharp]
といった具合に書ける。

LINQを使うには
using System.Linq;
が必要で、LINQを使うオブジェクトのクラスはIEnumerableを継承している必要がある。
主にはSystem.Collections.Genericにあるクラスが継承されているのでLINQが使える。
あとLINQでは上記のOrderBy().ThenBy()のように続けて書けるのでいくつか積み重ねた結果も取得できる。
その上、処理自体は実際に必要になったときまで実行されないのでメモリ上も節約ができる。
もし独自クラスをLINQに対応させたい場合にはIEnumerableを継承し、必要なメソッドを実装すれば対応できるようです。

ただ、Unityで使うには注意点があるようで下記の記事も読んでおいたほうが良さそうです。
やっぱりUnityでもC#なんだからLINQが使いたい!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です