Re: note

技術的な知見やポエムなど役に立たない情報を書き連ねる場所

UnityでLINQを使って楽をする

f:id:hik0leaf:20190608153114p:plain

LINQを使うとデータ処理を簡単に行うことができます。 全体のコードは以下のリポジトリにありますので、別記事の UniRxを使ってみる も合わせてご覧ください。

github.com

What's LINQ?

C# の統合言語クエリ (LINQ) | Microsoft Docs

  • Language Integrated Query (LINQ)
  • SQLクエリっぽい操作
  • ラムダ式
  • メソッドチェーン
  • using System.Linq で使えるようになるよ

LINQの詳しい解説は他のサイトに譲るとして、ここではサンプルコードを記載します。実際に実行して挙動を確認してみると理解が進むはずです。

LINQ Operators

Average

平均値を抽出

using System.Linq;

double average = new List<int> { 0, 1, 2, 3 }.Average();
Debug.Log(average); // 1.5

Min

最小値を抽出

using System.Linq;

int min = new List<int> { 21, 9, 15, 3, 8, 11 }.Min();
Debug.Log(min); // 3

Max

最大値を抽出

using System.Linq;

int max = new List<int> { 5, 9, 15, 3, 21, 8, 11 }.Max();
Debug.Log(max); // 21

Sum

合計値を算出

using System.Linq;

int sum = new List<int> { 1, 2, 3, 4, 5 }.Sum();
Debug.Log(int); // 15

Where

条件式がTrueとなる要素で再構成します。

using System.Linq;

var list = new List<int> { 1, 2, 3, 4, 5 }.Where(x => x > 2);
Debug.Log(string.Join(", ", list)); // { 3, 4, 5 }

Select

式を評価した値で再構成します。

using System.Linq;

var list = new List<int> { 1, 2, 3, 4, 5 }.Select(x => x * x);
Debug.Log(string.Join(", ", list)); // { 1, 4, 9, 16, 25}

メソッドチェーン

メソッド(オペレータ)を連結することで連続して処理することができます。

using System.Linq;

var list1 = new List<int> { 1, 2, 3, 4, 5 };
var list2 = list1.Where(x => x > 2);
var list3 = list1.Where(x => x > 2).Select(x => x * x);

Debug.Log(string.Join(", ", list1));// { 1, 2, 3, 4, 5 }
Debug.Log(string.Join(", ", list2));// { 3, 4, 5 }
Debug.Log(string.Join(", ", list3));// { 9, 16, 25 }

(foreach)

foreachはLINQではありませんが、要素を取り出す操作としてLINQと組み合わせて使うこともできます。

var list = new List<int> { 1, 2, 3, 4, 5 };
list.ForEach(x => Debug.Log(x * x)); // 1, 4, 9, 16, 25

// list.ForEach(x => {
//     Debug.Log("-----");
//     Debug.Log(x * x);
// });